在我的Java源代码中,我想使用存储在我的应用程序的“lib”目录中的java archives(.jar)中的不同类。但是,如果我做“蚂蚁运行”,那么我总是得到一个“java.lang.NoClassDefFoundError”消息。我尝试了几件事来解决它,但没有任何效果......也许这里有人可以帮助我吗?
这是我的 build.properties 文件:
app.name=MyApplication
app.version=1.0
main.class=mypackage.MyMain
build.dir=build
classes.dir=${build.dir}/classes
jar.dir=${build.dir}/jar
dist.dir=dist
src.dir=src
test.dir=test
lib.dir=lib
这是我的 build.xml :
<?xml version="1.0" encoding="UTF-8" ?>
<project name="My Project" default="run" basedir=".">
<description>My description.</description>
<property file="build.properties" />
<path id="classpath">
<fileset dir="${lib.dir}" includes="*.jar"/>
</path>
<!-- Initialization -->
<target name="init" description="Prepare needed directories.">
<mkdir dir="${build.dir}" />
<mkdir dir="${classes.dir}" />
<mkdir dir="${jar.dir}" />
<mkdir dir="${dist.dir}" />
<mkdir dir="${lib.dir}" />
</target>
<!-- Cleanup -->
<target name="clean" description="Remove all files created by the build/test process.">
<delete dir="${classes.dir}" />
<delete dir="${dist.dir}" />
</target>
<!-- Compile application -->
<target name="compile">
<mkdir dir="${classes.dir}"/>
<javac srcdir="${src.dir}"
destdir="${classes.dir}"
debug="yes"
includeantruntime="false">
<!-- <classpath refid="classpath" /> -->
</javac>
</target>
<!-- Java Archive -->
<target name="jar" depends="compile">
<!--<delete file="${jar.dir}/${app.name}-${app.version}.jar"/>-->
<delete dir="${jar.dir}"/>
<mkdir dir="${jar.dir}"/>
<jar destfile="${jar.dir}/${app.name}-${app.version}.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Class-Path" value="${lib.dir}"/>
<attribute name="Main-Class" value="${main.class}"/>
</manifest>
</jar>
</target>
<!-- Run application -->
<target name="run" depends="jar">
<java jar="${jar.dir}/${app.name}-${app.version}.jar"
fork="true">
</java>
<!--
<java fork="true" classname="${main.class}">
<classpath>
<path refid="classpath"/>
<path location="${jar.dir}/${app.name}-${app.version}.jar"/>
</classpath>
</java>
-->
</target>
</project>
如果有人能提供帮助,那就太好了。
干杯!
尼
答案 0 :(得分:3)
将classes.dir=${build.dir}/classes
替换为classes.dir=build/classes
,将jar.dir=${build.dir}/jar
替换为jar.dir=build/jar
文件中的build.properties
将会有效。
答案 1 :(得分:2)
请按如下方式编辑目标jar。我相信它会奏效。
<target name="jar" depends="compile">
<delete dir="${jar.dir}"/>
<mkdir dir="${jar.dir}"/>
<jar destfile="${jar.dir}/${app.name}-${app.version}.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Class-Path" value="${lib.dir}"/>
<attribute name="Main-Class" value="${main.class}"/>
</manifest>
<zipgroupfileset dir="${lib.dir}"/>
</jar>
答案 2 :(得分:0)
我发现您一直在尝试为<java>
任务设置类路径。
你试过了吗?
<java jar="${jar.dir}/${app.name}-${app.version}.jar" fork="true">
<classpath refid="classpath" />
</java>
编辑:仔细检查属性文件中的值。您是否有lib.dir
或jar.dir
http://ant.apache.org/faq.html#properties-not-trimmed
ant无法通过构建我的程序 即使我放了所需的罐子,也是javac 在外部build.properties文件中 并通过pathelement或引用它们 classpath refid。
当ant加载来自的属性时 外部文件它没有触及 属性值,尾随空白 例如,不会修剪。
如果值表示文件路径, 像一个需要编译的jar,任务 这需要价值,javac 示例将无法编译,因为它 由于尾随而无法找到该文件 空格。