如何禁用Java扩展机制

时间:2015-05-24 00:30:54

标签: java

我们的产品是一个用Java编写的独立OS X桌面应用程序。我们包含一个嵌入式JRE来运行我们的软件。

JRE启动的规则似乎在我们在类路径上明确包含的库之前将/usr/lib/java/Library/Java/Extensions~/Library/Java/Extensions中的任何JAR文件放在类路径上。

如果用户在任何Java扩展机制文件夹中都有任何JAR文件,那么这些JAR文件将添加到我们的类路径中。最近的支持事件是因为客户在/usr/lib/java中拥有旧版本的关键第三方库 - 这导致我们的软件在启动时意外崩溃。

在调用我们应用中嵌入的JRE时,我无法确定如何禁用此扩展机制。我怎么能这样做?

─────────
注意:似乎不推荐使用此扩展机制,并最终将其删除:https://blogs.oracle.com/java-platform-group/entry/planning_safe_removal_of_under

1 个答案:

答案 0 :(得分:10)

您可以覆盖"java.ext.dirs" JVM参数以指向某个应用程序目录。

我测试了覆盖JVM Argument,它运行正常。

$ ls /Library/Java/Extensions
extentionstest.jar
$
$java ExtentionTest
Main method executed fine.
$
$ java -Djava.ext.dirs=/home/pratapk/work/ ExtentionTest
Error: Could not find or load main class ExtentionTest
$ 

ExtentionTest类内置于extentionstest.jar并复制到/Library/Java/Extensions

public class ExtentionTest {
    public static void main(String args[] ) {
        System.out.println("Main method executed fine.");
    }
}

java.ext.dirs支持多个目录作为冒号分隔。在您的情况下, JRE与您的应用一起包含,您可以更轻松地包含lib/ext的路径,而不包括"/Library/Java/Extensions"