是否可以“添加” java中动态的类路径?
java -classpath ../classes;../jar;. parserTester
如何以编程方式获取上述命令中的功能? 比如,是否可以运行为:
java parserTester
并得到相同的结果? 我尝试使用 URLClassLoader 但它修改了类路径并且没有添加到它。
谢谢!
感谢米尔豪斯的回复。 但这就是我想要做的。如何才能首先将 jar 放入类路径中? 我也尝试使用自定义类加载器:(
这有效..但抱歉我只需要运行它: java解析器测试器 我想知道这样的事情是否可能???
它需要如此,因为我有 parserTester.java 和 .class 在一个单独的文件夹中。 我需要保留文件结构。 parserTester 使用单独的 jar 文件夹中的 jar。
java -classpath ../classes;../jar;. parserTester
How can i get the functionality in the above command programmatically? Like, is it possible to run as:
java parserTester
and get the same result? I tried using URLClassLoader but it modifies the classpath and does not add to it.
Thanx!
Thanks for the response Milhous. But that is what i am trying to do.. How is it possible to get the jar into the classpath first? I tried using a custom classloader too :(
That works.. But sorry that i need to run it only as:
java parserTester
I would like to know if such a thing is possible???
It needs to be so bcoz i have parserTester.java and .class in a separate folder. I need to retain the file structure. The parserTester makes use of a jar in a separate jar folder.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
您可以使用 java.net.URLClassLoader 来加载具有您希望的任何程序定义的 URL 列表的类:
一些花哨的步骤可以扩展它以支持使用通配符路径名来获取 JAR 的整个目录(此代码有一些对实用程序方法的引用,但它们的实现在上下文中应该是显而易见的):
You can use a java.net.URLClassLoader to load classes with any program defined list of URL's you wish:
And a little fancy footwork can extend it to support using wildcarded pathnames to pick up entire directories of JARs (this code has some references to utility methods, but their implementation should be obvious in the context):
我必须同意其他两个海报,听起来你使测试类过于复杂化。
将 .java 和 .class 文件放在不同的文件夹中,而依赖第三个文件夹中的 jar 文件,而无需以编程方式更改类路径的情况并不罕见。
如果您这样做是因为您不想每次都在命令行上键入类路径,我建议您使用 shell 脚本或批处理文件。 更好的是,一个 IDE。
我真正的问题是你为什么要尝试在代码中管理类路径?
I have to agree with the other two posters, it sounds like you're overcomplicating a test class.
It's not that unusual to have the .java and .class files in separate folders, while depending on jar files in yet a third, without programmatically changing the classpath.
If you're doing it because you don't want to have to type the classpath on the command line everytime, I would suggest a shell script or batch file. Better yet, an IDE.
The question I really have is why are you doing trying to manage the classpath in code?
您可以实现自己的类加载器,但该类/jar 必须位于类路径中才能执行。
尝试
或
或
You could implement your own class loader, but that class/jar has to be in the classpath for it to be executed.
try
or
or
您可以编写批处理文件或shell脚本文件来导出类路径并运行java程序。
在 Windows 中,
设置 classpath=%classpath%;../classes;../jars/*
java ParserTester
在 Unix 中,
导出类路径=%classpath%:../classes:../jars/*
java ParserTester
如果您将文件名命名为 parser.bat 或 parser.sh,则可以通过在相应操作系统中调用 parser 来运行它。
从 java 1.6 开始,您可以通过以下命令将目录中的所有 jar 包含到类路径中: /*
如果您尝试动态生成 java 文件,请编译并添加到类路径中,设置生成类文件的目录预先的类路径。 它应该加载该类。
如果你正在修改已经生成的java类,基本上修改后重新编译,如果你想加载新的类,你需要使用自定义类加载器来避免类的缓存。
You can write a batch file or shell script file to export the classpath and run the java program.
In Windows,
set classpath=%classpath%;../classes;../jars/*
java ParserTester
In Unix,
export classpath=%classpath%:../classes:../jars/*
java ParserTester
If you name the file name as parser.bat or parser.sh, you can just run that by calling parser in respective OS.
From java 1.6, you can include all the jars in a directory into the classpath just by saying /*
If you are trying to generate a java file dynamically, compile and add into the classpath, set the directory into which the class file gets generated in the classpath beforehand. It should load the class.
If you are modifying the already generated java class, basically recompiling after modification and if you want to load the new class, you need to use your custom class loader to avoid the caching of the class.
我认为您想要的是一个“执行包装器”或特定于平台的“启动器”...通常该组件用于检测您的操作系统、体系结构和依赖项,然后在启动应用程序之前进行调整。 这是一种老式的设计模式(80 年代及更早的版本),但至今仍被广泛使用。 这个想法是,您的程序可以与系统和环境无关,启动器将做好准备并告诉软件它需要知道的一切。 许多现代开源程序使用 Shell 脚本和批处理文件等来执行此操作...例如 Apache Tomcat。 您可以轻松地用 java 制作包装器,并使用命令行 exec 启动软件(请务必在 *NIX 中的 exec 命令末尾添加“&”,以便您的包装器可以退出,只留下您的软件运行...还可以让您关闭 shell 窗口而不终止进程)
I think what you want is an "Execution Wrapper" or a platform specific "Launcher"... typically this component is used to detect your OS and architecture and dependencies and then makes adjustments before launching your application. It is an old school design pattern (talking 80's and earlier) but is still used a lot today. The idea is that you program can be system and environment agnostic and the launcher will make preparations and tell the software everything it needs to know. Many modern open source programs do this with Shell scripts and Batch Files, etc... Apache Tomcat for example. You could just as easily make the wrapper in java an have it launch the software with a command line exec (be sure to add " &" to the end of you exec command in *NIX so your wrapper can exit leaving only your software running... also lets you close the shell window without killing the process)
我没理解错吧?! 您拥有它的唯一原因是您想要在不指定类路径的情况下启动类并在运行时加载它? ...
而不是
可能我没有明白你的原因。 但是,如果“这就是”您想要的,您可以执行以下操作(尽管这对我来说没有多大意义)
类似下面的“java -伪代码”
请告诉我我是否正确。 如果您想做其他事情,我很乐意提供帮助。
Did I understand right?! The only reason you have it that you want to launch your class without specifying the classpath and load it at runtime? ...
instead of
Probably I didn't get your reason. But if "that's" what you want you can do the following ( although it does not make much sense to me )
Something like the following "java -pseudo code "
Please tell me if I get it right. If you want to do something else I would gladly help.
非常好的帖子,就我而言,我这样做效果很好(注意:Windows 特定):
Excellent good post, in my case I did this to work well (note: Windows specific):