【问题标题】:My jar file built with ant doesn't run when double click双击时我用ant构建的jar文件不运行
【发布时间】:2015-09-30 17:06:38
【问题描述】:

我一直在尝试在 http://ant.apache.org/manual/tutorial-HelloWorldWithAnt.html 上学习本教程。

我已经到了题为使用外部库的部分,我正在尝试使用 log4j2 库。当我在终端中执行 ant cleanant compile jar run 时,它启动得很好,但是,如果我转到文件系统中的 build/jar 文件夹并双击jar 文件,打不开。

目前,我的构建文件如下所示:

<project name="HelloWorld" basedir="." default="main">

<property name="src.dir"     value="src"/>

<property name="build.dir"   value="build"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir"     value="${build.dir}/jar"/>

<property name="main-class"  value="hlw.HelloWorld"/>

<property name="lib.dir"     value="lib"/>

<path id="classpath">
    <fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>

<target name="clean">
    <delete dir="${build.dir}"/>
</target>

<target name="compile">
    <mkdir dir="${classes.dir}"/>
    <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" includeantruntime="false"/>
    <copy todir="${classes.dir}">
        <fileset dir="${src.dir}" excludes="**/*.java"/>
    </copy>
</target>

<target name="jar" depends="compile">
    <mkdir dir="${jar.dir}"/>
    <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
        <manifest>
            <attribute name="Main-Class" value="${main-class}"/>
            <attribute name="Class-Path" value="config/ properties/ ${manifest.classpath}" />
        </manifest>
    </jar>
</target>

<target name="run" depends="jar">
    <java fork="true" classname="${main-class}">
        <classpath>
            <path refid="classpath"/>
            <path location="${jar.dir}/${ant.project.name}.jar"/>
        </classpath>
    </java>
</target>

<target name="clean-build" depends="clean,jar"/>

<target name="main" depends="clean,run"/>

<target name="test" depends="jar">
    <junit printsummary="yes">
        <classpath>
            <path refid="classpath"/>
            <path refid="application"/>
        </classpath>

        <batchtest fork="yes">
            <fileset dir="${src.dir}" includes="*Test.java"/>
        </batchtest>
    </junit>
</target>

这个构建文件是否有问题导致双击时 jar 无法工作?

编辑:在终端输入 jar -jar HelloWorld.jar 时,我得到以下响应:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager
at hlw.HelloWorld.<clinit>(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more

【问题讨论】:

  • java -jar HelloWorld.jar 输出什么?
  • 它说“错误:无法找到或加载主类 jar”
  • 您在-jar 中似乎错过了-。复制粘贴命令以确保它是正确的。
  • 哦,对不起,你的权利,当我输入正确的内容时,它会出现:线程“main”中的异常 java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager at hlw.HelloWorld.(Unknown Source) 引起:java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader .loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 1 更多
  • 我已经在问题的编辑中写了这个,因为我无法在评论中很好地格式化它。

标签: java ant jar build.xml


【解决方案1】:

从 ant 运行您的应用程序时,您明确地将 lib/ 目录中的 jar 添加到您的类路径中。当直接运行jar时,java无法知道这些jar在哪里。

解决此问题的最简单方法是将所有这些依赖项捆绑在单个 jar 中:

<target name="jar" depends="compile">
    <mkdir dir="${jar.dir}"/>
    <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
        <zipgroupfileset dir="${lib.dir}" includes="**/*.jar"/>
        <manifest>
            <attribute name="Main-Class" value="${main-class}"/>
            <attribute name="Class-Path" value="config/ properties/ ${manifest.classpath}" />
        </manifest>
    </jar>
</target>

<target name="run" depends="jar">
    <java fork="true" jar="${jar.dir}/${ant.project.name}.jar" />
</target>

如果您不想重新打包这些库,可以在清单中添加它们的路径: https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2016-01-27
    • 2018-12-21
    • 2013-07-15
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多