繁体   English   中英

从清单文件Java禁用类路径

[英]Disabling Class-Path from Manifest-Files java

我正在开发一种具有自动更新功能的软件,即使用户没有对安装文件夹的写入权限,该软件也可以使用。 为此,应用程序分析类路径,并检查在单独的用户目录中的类路径中的条目是否存在更新的JAR文件。 在那种情况下,应用程序会生成修订的类路径,并使用该类路径启动新的VM。

当Java默认类加载器通过插入清单文件中提到的库来更改JAR文件的顺序时,就会出现我的问题。

我将为您提供一个简化的示例,该示例缺少许多细节,并且对于实际的更新方案没有意义,但是它将解释我的问题。 因此,假设我不允许更改main.jar的内容。

我用以下方式启动应用程序

java -jar main.jar

main.jar有一个正确的MANIFEST文件,其中包含Main-Class和Class-Path,并引用了其他库c.jar和d.jar。

因此,运行时的完整Class-Path将是:

main.jar, c.jar, d.jar

该顺序很重要,因为main.jar会覆盖c.jar中的类。 现在,该应用程序发现有可用的更新,这需要其他库a.jar和b.jar。

因此,应用程序现在将计算新的类路径:

main.jar, a.jar, b.jar, c.jar, d.jar

同样,顺序很重要,因为a.jar会覆盖d.jar中的类。 现在,应用程序使用显式类路径启动新的VM:

java -cp main.jar:a.jar:b.jar:c.jar:d.jar <Main-Class>

不幸的是,java通过在main.jar的位置插入由main.jar的MANIFEST引用的库来更改类路径。 因此,有效的类路径将是:

main.jar, c.jar, d.jar, a.jar, b.jar, c.jar, d.jar
--------  ------------  --------------------------
   CP       MANIFEST                CP  

按照该顺序,c.jar现在具有比a.jar更高的优先级。 从a.jar覆盖的类不会被加载。

解决此问题的明显方法是提供没有清单的main.jar。 但这会导致其他问题,我想避免。

我的问题是:有没有一种方法可以禁止Java的行为,以在搜索类路径时从清单中包含引用的JAR文件?

只是一个快速而未经检验的想法。 如果您能够在运行时动态加载更新的jar,而不是在命令行中指定它们,则可以为这些jar创建URLClassLoader并使用该自定义类加载器显式加载类:

URL[] jarurls = new URL[]{jar1,jar2,...};
URLClassLoader customCL= new URLClassLoader (jarurls, getClass().getClassLoader());
Class clazz = Class.forName ("com.blablabla.MyClass1", true, customCL);
MyClass1 instance = (MyClass1)clazz.newInstance();

您可以将用户文件夹中的每个jar加载到该类加载器中。 当实例化一个类时,您将优先考虑自定义类加载器和默认类加载器的故障转移。

这肯定会增加设计的复杂性/风险,因为现在需要通过反射来实例化类。

暂无
暂无

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

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