0

我查看了这里和更广泛的网络以找到解决方案。有相关材料,但我一直找不到关于我的具体问题的任何有用信息。

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

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

如果我运行 plugintest.jar ,java -jar plugintest.jar那么即使我将 ./plugins/ (或它的变体)添加到清单中的 Class-Path: ,它也找不到插件。阅读表明这仅适用于类,而不适用于 jar,因此我尝试将两个插件中的类plugins直接放在目录的完整路径中,但没有成功。

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

我找到了另一个解决方案,我为 中找到的 jar 创建了一个类加载器plugins,它适用于这个简单的案例,但阅读表明我可能会在更复杂的应用程序中遇到安全问题。

有没有办法解决问题,这样我就可以简单地运行而java -jar plugintest.jar无需自己加载类,或者这就是它的方式?

4

2 回答 2

0

好的,所以至少是部分答案,经过更多的实验。毕竟,将类文件放在插件目录中确实有效,但您必须记住包含 META-INF 目录和 META-INF/services。services 目录中的文件必须包含对所有插件的引用。

如果有一个允许直接使用插件 jar 文件的解决方案会很好,但是创建类加载器似乎是执行此操作的唯一方法(至少我已经找到),这可能会导致安全性问题,如前所述。

于 2015-11-30T13:41:13.643 回答
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

于 2016-02-16T12:57:16.273 回答