双击时,我用 ant 构建的 jar 文件没有 运行
My jar file built with ant doesn't run when double click
我一直在尝试在 http://ant.apache.org/manual/tutorial-HelloWorldWithAnt.html 上学习本教程。
我已经到了标题为使用外部库的部分,我正在尝试使用 log4j2 库。当我在终端中执行 ant clean 和 ant compile jar 运行 时,它启动得很好,但是,如果我去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
当 运行 你的应用程序来自 ant 时,你明确地将 lib/
目录中的 jar 添加到你的 class 路径。当直接 运行 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
我一直在尝试在 http://ant.apache.org/manual/tutorial-HelloWorldWithAnt.html 上学习本教程。
我已经到了标题为使用外部库的部分,我正在尝试使用 log4j2 库。当我在终端中执行 ant clean 和 ant compile jar 运行 时,它启动得很好,但是,如果我去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
当 运行 你的应用程序来自 ant 时,你明确地将 lib/
目录中的 jar 添加到你的 class 路径。当直接 运行 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