Java ANT:build.xml的问题

时间:2012-06-08 12:48:36

标签: java ant dependencies classnotfoundexception

我想知道是否有人可以帮我解决一个严重的问题...... 我需要使用大量依赖项从项目中创建一个jar ... 问题是:我用自己的手写的build.xml文件无效。 更具体地说,它运行没有任何问题,只是一个警告:

Buildfile: C:\Users\Alexis Fasquel\workspace\FirstEditServer\build.xml
clean:
   [delete] Deleting directory C:\Users\Alexis Fasquel\workspace\FirstEditServer\bin
   [delete] Deleting directory C:\Users\Alexis Fasquel\workspace\FirstEditServer\dist
makedir:
    [mkdir] Created dir: C:\Users\Alexis Fasquel\workspace\FirstEditServer\bin
    [mkdir] Created dir: C:\Users\Alexis Fasquel\workspace\FirstEditServer\dist
compile:
    [javac] C:\Users\Alexis Fasquel\workspace\FirstEditServer\build.xml:101: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 14 source files to C:\Users\Alexis Fasquel\workspace\FirstEditServer\bin
jar:
      [jar] Building jar: C:\Users\Alexis Fasquel\workspace\FirstEditServer\dist\firstEditServer.jar
main:
BUILD SUCCESSFUL
Total time: 1 second

但不幸的是我仍然得到一些classNotFoundDefError


我没有打印完整的痕迹,因为它是我试图实现的第一个类,但是没有找到...所以我猜测什么都没有... 但这是:

Exception in thread "main" java.lang.NoClassDefFoundError: gate/util/GateExcept
on
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: gate.util.GateException
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 6 more

有我的build.xml文件......有人可以看看它,也许会发现我的错误是什么?

<?xml version="1.0"?>
<project name="Ant-Test" default="main" basedir=".">
    <!-- Sets variables which can later be used. -->
    <!-- The value of a property is accessed via ${} -->
    <property name="src.dir" location="src" />
    <property name="bin.dir" location="bin" />
    <property name="gate.dir" location="gate" />
    <property name="virtuoso.dir" location="virtuoso" />
    <property name="recommendation.dir" location="recommendation" />
    <property name="dist.dir" location="dist" />

    <path id="bin.classpath">
        <fileset dir="${virtuoso.dir}">
            <include name="openrdf-sesame-2.6.5-onejar.jar" />
            <include name="slf4j-api-1.5.0.jar" />
            <include name="slf4j-jdk14-1.5.0.jar" />
            <include name="virt_sesame2.jar" />
            <include name="virtjdbc3.jar" />
        </fileset>

        <fileset dir="${gate.dir}">
            <include name="plugins\Gazetteer_LKB\Gazetteer_LKB.jar" />
            <include name="lib\gate.jar" />
            <include name="lib\log4j.jar" />
            <include name="lib\commons-io.jar" />
            <include name="plugins\Tagger_Framework\TaggerFramework.jar" />
            <include name="lib\ant-contrib.jar" />
            <include name="lib\ant-launcher.jar" />
            <include name="lib\ant.jar" />
            <include name="lib\aopalliance.jar" />
            <include name="lib\apache-mime4j-core.jar" />
            <include name="lib\apache-mime4j-dom.jar" />
            <include name="lib\bcmail-jdk15.jar" />
            <include name="lib\bcprov-jdk15.jar" />
            <include name="lib\commons-codec.jar" />
            <include name="lib\commons-compress.jar" />
            <include name="lib\commons-lang.jar" />
            <include name="lib\commons-logging.jar" />
            <include name="lib\dom4j.jar" />
            <include name="lib\fontbox.jar" />
            <include name="lib\gate-asm.jar" />
            <include name="lib\gate-compiler-jdt.jar" />
            <include name="lib\lucene-core.jar" />
            <include name="lib\metadata-extractor.jar" />
            <include name="lib\nekohtml.jar" />
            <include name="lib\pdfbox.jar" />
            <include name="lib\poi-ooxml-schemas.jar" />
            <include name="lib\poi-ooxml.jar" />
            <include name="lib\poi-scratchpad.jar" />
            <include name="lib\poi.jar" />
            <include name="lib\spring-aop.jar" />
            <include name="lib\spring-beans.jar" />
            <include name="lib\spring-core.jar" />
            <include name="lib\tika-core.jar" />
            <include name="lib\tika-parsers.jar" />
            <include name="lib\wstx-lgpl.jar" />
            <include name="lib\xercesImpl.jar" />
            <include name="lib\xmlbeans.jar" />
            <include name="lib\xmlunit.jar" />
            <include name="lib\xpp3.jar" />
            <include name="lib\xstream.jar" />
            <include name="lib\ivy.jar" />
            <include name="lib\java-getopt.jar" />
            <include name="lib\java2html.jar" />
            <include name="lib\javacc.jar" />
            <include name="lib\jaxen.jar" />
            <include name="lib\jdom.jar" />
            <include name="lib\jempbox.jar" />
            <include name="lib\junit.jar" />
            <include name="plugins\Gazetteer_LKB\lib\commons-cli-1.1.jar" />
            <include name="plugins\Gazetteer_LKB\lib\commons-collections-3.2.1.jar" />
            <include name="plugins\Gazetteer_LKB\lib\commons-httpclient-3.1.jar" />
            <include name="plugins\Gazetteer_LKB\lib\kim-api-3.0-RC5.jar" />
            <include name="plugins\Gazetteer_LKB\lib\kim-util-3.0-RC5.jar" />
            <include name="plugins\Gazetteer_LKB\lib\owlim-lite-4.3.jar" />
            <include name="plugins\Gazetteer_LKB\lib\trove4j-2.0.2.jar" />
            <include name="plugins\Gazetteer_LKB\lib\openrdf-sesame-2.6.3-onejar.jar" />
            <include name="plugins\Gazetteer_LKB\lib\slf4j-api-1.5.11.jar" />
            <include name="plugins\Gazetteer_LKB\lib\slf4j-log4j12-1.5.11.jar" />
        </fileset>

        <fileset dir="${recommendation.dir}">
            <include name="simmetrics_jar_v1_6_2_d07_02_07.jar" />
        </fileset>
    </path>

    <!-- Deletes the existing bin, docs and dist directory-->
    <target name="clean">
        <delete dir="${bin.dir}" />
        <delete dir="${dist.dir}" />
    </target>

    <!-- Creates the  bin and dist directory-->
    <target name="makedir">
        <mkdir dir="${bin.dir}" />
        <mkdir dir="${dist.dir}" />
    </target>

    <!-- Compiles the java code (including the usage of library for JUnit -->
    <target name="compile" depends="clean, makedir">
        <javac srcdir="${src.dir}" destdir="${bin.dir}" classpathref="bin.classpath">
        </javac>

    </target>


    <!--Creates the deployable jar file  -->
    <target name="jar" depends="compile">
        <jar destfile="${dist.dir}\firstEditServer.jar" basedir="${bin.dir}">
            <manifest>
                <attribute name="Main-Class" value="com.firstedit.main.Main" />
            </manifest>
        </jar>
    </target>

    <target name="main" depends="compile, jar">
        <description>Main target</description>
    </target>

</project>

如您所见,GateException确实在gate.jar中......

enter image description here

4 个答案:

答案 0 :(得分:1)

假设暂时没有找到的类是在jar文件lib \ gate.jar中,我会说发生的事情是你正在从源代码构造jar(firstEditServer.jar)文件你的项目就是这样。为了执行该jar,您还需要确保lib ...目录中的所有jar文件也在类路径中。

现在,如果您希望构建的单个jar文件包含库jar中的所有类,那么您必须以稍微不同的方式构建jar文件。您无法构建包含其他jar的可执行jar(具有Main-Class属性的jar)。标准类加载器不会在一个jar中查找其他jar文件。因此,您需要将库jar类扩展到最终的jar中。

Ant使用类似下面的内容为此提供支持。 zipgroupfileset 是一个任务,它将获取jar文件列表,展开它们并将类本身包含在目标jar中。我过滤掉manifest.mf和属性文件,这样它们就不会与我自己的文件冲突(例如库jar中的log4j.properties文件)。

这将创建一个包含所有lib jar的所有内容的jar。清单文件将发生冲突,看到的最后一个清单文件将获胜。

<jar destfile='${build.dir}/lib-jars.jar'>
   <zipgroupfileset dir='${lib.dir}'>
     <include name='**/*.jar'/>
   </zipgroupfileset>
</jar>

此处使用的 zipfileset 与一个jar可以过滤掉所需的一个jar中的任何内容。这会删除MANIFEST.MF文件,但也可以删除包含其他排除标记的其他文件。

<jar destfile='${jar.file}' basedir='${classes.dir}'>
  <zipfileset src='${build.dir}/lib-jars.jar'>
    <exclude name="META-INF/MANIFEST.MF"/>
  </zipfileset>
  <manifest>
    <attribute name="Built-By" value="${user.name}"/>
    <attribute name="Main-Class" value="${main.class}"/>
    <section name="common">
      <attribute name="Specification-Title" value="${project.title}"/>
      <attribute name="Specification-Version" value="${release.version}"/>
      <attribute name="Specification-Vendor" value="${vendor}"/>
      <attribute name="Implementation-Title" value="${project.title}"/>
      <attribute name="Implementation-Version" value="${release.version} ${TODAY}"/> 
      <attribute name="Implementation-Vendor" value="${vendor}"/>
    </section>
  </manifest>      
</jar>

答案 1 :(得分:0)

确保您的lib文件夹位于类路径中。我有类似的事情我和你一样。构建是可以的,因为蚂蚁找到了罐子。如果要构建jar,请确保清单将jar添加到清单文件中的类路径中。有一个清单选项,你可以让你的jar添加一个清单文件。如果没有其他任何东西在命令行上运行您的程序并使用-classpath选项指向您的lib文件夹。我认为你的问题是在你的阶级路径上,我已经多次参加过这场战斗了。

答案 2 :(得分:0)

这不是答案,但评论时间太长,所以......

您可以执行以下步骤:

  1. 将简单的主要方法添加到gate.util.GateExcept
  2. public static void main( final String[] args ) {
        System.out.println( GateExcept.class.getName() );
    }
    
    1. 再次构建jar(让它调用myjar.jar)

    2. 运行此命令

      java -cp myjar.jar gate.util.GateExcept

    3. 如果可以正常试用(可执行jar)

      java -jar myjar.jar

    4. 在我看来,在屏幕截图中你有gate.util.GateException,但在异常堆栈中只有gate.util.GateExcep(但可能这只是SO问题)。

      如果有效,请告诉我。

答案 3 :(得分:0)

如果我错了,请纠正我,但是你没有使用ANT运行这个罐子,不是吗? ANT仅用于构建正确的jar文件?

启动java程序有两种方法

  1. java -jar myapp.jar
  2. java -cp myapp.jar MyAppClass
  3. 第一个要求您设置“Main-Class”和“Class-Path”清单条目。第二个要求您明确列出每个依赖项。

    我怀疑你正在尝试前者,但忘记包括类路径.....下面的问题有同样的问题。它概述了一个使用ANT manifestclasspath任务来简化清单中类路径设置的解决方案:

    Cannot find Main Class in File Compiled With Ant