Java 如何从可执行jar引用tools.jar

Java 如何从可执行jar引用tools.jar,java,Java,假设我正在这样做: java -jar someJar “someJar”需要引用tools.jar(用于jsp编译)。我不想将tools.jar捆绑在someJar中,因为我担心与正在执行的JVM不兼容。我不能指定-classpath,因为使用-jar时会忽略它。我试过-Djava.ext.dirs,但没用。有人知道如何从可执行jar引用tools.jar吗?从Java 1.4开始: 工具类现在位于 单独归档(tools.jar)并可以 仅在用户手册中包含时使用 类路径(稍后解释) 换句话说

假设我正在这样做:

java -jar someJar
“someJar”需要引用tools.jar(用于jsp编译)。我不想将tools.jar捆绑在someJar中,因为我担心与正在执行的JVM不兼容。我不能指定-classpath,因为使用-jar时会忽略它。我试过-Djava.ext.dirs,但没用。有人知道如何从可执行jar引用tools.jar吗?

从Java 1.4开始:

工具类现在位于 单独归档(tools.jar)并可以 仅在用户手册中包含时使用 类路径(稍后解释)

换句话说,tools.jar不能放在扩展目录中。这实际上意味着在JAR清单中指定它可能根本不是一个好主意。但是,有两种选择:

  • 使用CLASSPATH变量或-cp选项指定tools.jar。如果您在JAR中有一个主类,它现在可以使用
    java-cp$JDK_HOME/lib/tools.JAR MainClass
    命令初始化,其中
    MainClass
    是类的完全限定名
  • 如果您知道JDK主目录的位置,请使用加载tools.jar的自定义类加载器。使用JRE会使事情变得困难,因为您将被迫要求用户指定JDK的位置。JDK的位置可以使用System.getProperty调用通过java.home属性确定

  • -jar选项优先于-classpath选项。但是,您可以在正在执行的jar的清单文件中包含类路径引用。有一个名为“类路径”的属性,它可以包含对其他JAR的相对或绝对引用

    这里有一个片段向您展示如何

    <target name="jar" depends="compile">
        <jar destfile="foo.jar" basedir="classes">
            <manifest>
                <attribute name="Main-Class" value="com.wiggle.foo" />
                <attribute name="Class-Path" 
                    value="C:/Java/jdk1.5.0_21/lib/tools.jar" />
            </manifest>
        </jar>
    </target>
    
    
    

    请注意,如果要在类路径属性中包含多个JAR,它们必须位于清单文件的一行中,我不希望清单引用依赖于系统的位置。在使用-jar时,我也不能使用-classpath。我认为解决这个问题的方法是使用-classpath,而不是使用-jar。我将把主类放在命令行上,而不是将主类放在清单中