我在这里和更广泛的网站上找到了解决方案。有相关的材料,但我一直无法找到有关我的具体问题的任何有用的东西。
我正在开发一些需要接受插件的Java软件。我不想使用像OSGi这样的花哨框架,而ServiceLoader似乎提供了适当级别的支持。我基本上得到了它的工作,但我遇到类路径的问题。我的目录结构如下:
progfolder
|___________ plugintest.jar
|___________/plugins
|________ plugin1.jar
|________ plugin2.jar
如果我使用java -jar plugintest.jar
运行plugintest.jar,那么即使我在清单中将./plugins/(或其变体)添加到Class-Path:它也找不到插件。阅读表明这只适用于类,而不适用于jar,所以我尝试将plugins
内的两个插件中的类直接放在目录的完整路径中,但没有成功。
如果我使用-cp plugins/*
选项,我不允许添加-jar
将插件文件夹添加到类路径中。为了解决这个问题,我可以使用java -cp plugintest.jar;plugins/* com.plugin.test.Main
运行,这可以正常工作 - 检测到两个插件并可通过代码访问,但命令行有点笨拙,尽管我可以忍受它,如果它是最好的选项。
我找到了另一种解决方案,我在plugins
中创建了一个用于jars的类加载器,它适用于这个简单的情况,但是阅读建议我可能会在更复杂的应用程序中遇到安全问题。
有没有办法解决问题所以我可以简单地使用java -jar plugintest.jar
运行,而不必自己加载类或者这是否就是这样?
答案 0 :(得分:0)
好的,至少部分答案,经过更多实验。毕竟,将类文件放在plugins目录中确实有效,但您必须记住包含META-INF目录和META-INF / services。 services目录中的文件必须包含对所有插件的引用。
如果有一个允许直接使用插件jar文件的解决方案会很好,但创建一个类加载器似乎是唯一的方法(至少我发现),这个如前所述,可能会导致安全问题。
答案 1 :(得分:0)
上次我遇到类似的问题[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