繁体   English   中英

可执行jar中的Class-Path设置似乎不适用于插件

[英]Class-Path setting in executable jar doesn't seem to work for plugins

我在这里和更广阔的网络中寻找了解决方案。 有相关的材料,但是我找不到关于我的特定问题的任何有用信息。

我正在开发一些需要接受插件的Java软件。 我不想使用像OSGi这样的框架,而ServiceLoader似乎提供了正确的支持水平。 我基本上已经工作了,但是类路径有问题。 我的目录结构如下:

progfolder |___________ plugintest.jar |___________/plugins |________ plugin1.jar |________ plugin2.jar

如果我使用java -jar plugintest.jar运行plugintest.jar,那么即使我在清单中将./plugins/(或此版本的变体)添加到Class-Path:中,也找不到插件。 阅读表明,这仅适用于类,而不是罐子,所以我试图把从两个插件类里面plugins直接和他们的目录的完整路径之内,但没有成功。

如果我使用-jar选项,则不允许添加-cp plugins/*将plugins文件夹添加到类路径中。 为了解决这个问题,我可以使用java -cp plugintest.jar;plugins/* com.plugin.test.Main来运行,并且按预期方式工作-这两个插件可以通过代码检测到并且可以通过代码访问,但是命令行有点笨拙,尽管我可以接受,但如果它是最佳选择。

我找到了另一个解决方案,其中为在plugins找到的jar创建类加载器,该加载器在这种简单情况下可以工作,但是阅读表明我可能会遇到更复杂的应用程序中的安全性问题。

有没有一种方法可以解决这些问题,因此我可以简单地使用java -jar plugintest.jar来运行而不必自己加载类,或者这仅仅是它的方式吗?

好的,因此,在进行更多实验后,至少可以得到部分答案。 毕竟,将类文件放在plugins目录中确实可以,但是您必须记住包括META-INF目录和META-INF / services。 services目录中的文件必须包含对所有插件的引用。

如果有一个允许直接使用插件jar文件的解决方案,那将是很好的选择,但是创建类加载器似乎是这样做的唯一方法(至少我已经找到了),并且这可能会导致安全性如前所述。

上一次我遇到类似的问题[1]。 我在Java文档[2]中找到了答案:

注意:Class-Path标头指向本地网络上的类或JAR文件,而不是JAR文件中的JAR文件或可通过Internet协议访问的类。 要将JAR文件中的JAR文件中的类加载到类路径中,必须编写自定义代码以加载这些类。 例如,如果MyJar.jar包含另一个名为MyUtils.jar的JAR文件,则不能使用MyJar.jar清单中的Class-Path标头将MyUtils.jar中的类加载到类路径中。

[1] https://github.com/narvi-blog/01-exec-jar#dependency-jar-files-within-an-executable-jar-are-not-so-easy
[2] https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM