【发布时间】:2015-10-08 15:20:00
【问题描述】:
我通过ant创建了一个可执行的jar文件,它也引用了mysql-connector.jar,一个外部的jar文件。
当我执行 java -jar *.jar 时,它会执行,但会在所有 SQL 相关语句上提供ClassNotFoundException。我已按照Ant Tutorial 中给出的步骤进行操作。
如果我执行ant compile 和ant run,则数据库创建成功。
如何让它通过 jar 文件运行?
build.xml
<project name="OMSInstaller" basedir="." >
<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="lib.dir" value="lib"/>
<property name="main-class" value="Installer.OMSinstaller"/>
<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"/>
</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}"/>
</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>
</project>
lib 文件夹:
mysql-connector-java-*.jar
jtds-*.jar
【问题讨论】:
-
从内存中,当您执行 jars (java -jar) 时,java 将忽略传递给它的类路径属性,而是使用 jars 类路径清单属性。您应该将主 jar 依赖的任何依赖项添加到 jar 清单中
-
哦,好吧。因为我已经从 ant 的构建文件创建了一个 jar,所以无论如何都要在 build.xml 中将清单文件作为参数传递,以便它包含在 jar 中。如果不是,那么我应该如何将清单文件指定为已创建的 jar?
-
您可以基于一个装满 jars 的目录动态构建类路径并将其添加到生成的清单中。请参阅 ant 文档了解如何执行此操作
-
找到了一个旧的 ant 文件,我在其中做了类似的事情,必须添加答案,因为评论太长了