【问题标题】:Yet another Ant + JUnit classpath problem又一个 Ant + JUnit 类路径问题
【发布时间】:2011-02-17 20:00:35
【问题描述】:

我正在使用 Eclipse 开发一个 Eclipse SWT 应用程序。还有一些 JUnit 4 测试,用于测试一些 DAO。但是当我尝试通过 ant 构建运行测试时,所有测试都失败了,因为找不到测试类。

Google 培养了大约 100 万人,他们都有同样的问题,但他们的解决方案似乎都不适合我 -.- 。

这些是我的 build.xml 文件的内容:

<property name="test.reports" value="./test/reports" />
<property name="classes" value="build" />


<path id="project.classpath">
    <pathelement location="${classes}" />
</path>

<target name="testreport">
    <mkdir dir="${test.reports}" />
    <junit fork="yes" printsummary="no" haltonfailure="no">
        <batchtest fork="yes" todir="${test.reports}" >
            <fileset dir="${classes}">
                <include name="**/Test*.class" />
            </fileset>
        </batchtest>
        <formatter type="xml" />

        <classpath refid="project.classpath" />


    </junit>

    <junitreport todir="${test.reports}">
        <fileset dir="${test.reports}">
            <include name="TEST-*.xml" />
        </fileset>
        <report todir="${test.reports}" />
    </junitreport>
</target>

测试类与应用程序类一起位于 build-directory 中,尽管根据它们的包,它们位于某些子文件夹中。

也许这也很重要:起初 Ant 抱怨 JUnit 不在它的类路径中,但是自从我把它放在那里(使用 eclipse 配置编辑器)它抱怨 JUnit 在它的类路径中两次。

WARNING: multiple versions of ant detected in path for junit 
   [junit]          jar:file:C:/Users/as df/Documents/eclipse/plugins/org.apache.ant_1.7.1.v20090120-1145/lib/ant.jar!/org/apache/tools/ant/Project.class
   [junit]      and jar:file:/C:/Users/as%20df/Documents/eclipse/plugins/org.apache.ant_1.7.1.v20090120-1145/lib/ant.jar!/org/apache/tools/ant/Project.class

我尝试过指定每个子目录、每个类文件,我尝试过文件集和文件列表,但似乎没有任何效果。

感谢您的帮助,我已经在这件事上坐了好几个小时了...

【问题讨论】:

  • 您介意写用户名“as_df”而不是“as df”(下划线替换空白)吗?

标签: java eclipse ant junit classpath


【解决方案1】:

我只有在对 junit 任务使用“fork=true”选项时才得到这个。这是因为我的 ANT_HOME 里面有“..”(例如“/3rdparth/jboss/jboss-5/../tools”)。一旦我减少了这条路径,“多个版本的 ant”警告就消失了。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题“在 junit 的路径中检测到多个版本的 ant”。当我通过 Eclipse_Home 目录重命名并从中删除特殊字符时,问题就消失了。路径中有“[1]”导致问题。

    【讨论】:

      【解决方案3】:

      这个 Ant build.xml 对我来说很好用。查看属性以查看目录结构是否与您的匹配;根据需要进行调整。

      <?xml version="1.0" encoding="UTF-8"?>
      <project name="xslt-converter" basedir="." default="package">
      
          <property name="version" value="1.6"/>
          <property name="haltonfailure" value="no"/>
      
          <property name="out" value="out"/>
      
          <property name="production.src" value="src"/>
          <property name="production.lib" value="lib"/>
          <property name="production.resources" value="config"/>
          <property name="production.classes" value="${out}/production/${ant.project.name}"/>
      
          <property name="test.src" value="test"/>
          <property name="test.lib" value="lib"/>
          <property name="test.resources" value="config"/>
          <property name="test.classes" value="${out}/test/${ant.project.name}"/>
      
          <property name="exploded" value="out/exploded/${ant.project.name}"/>
          <property name="exploded.classes" value="${exploded}/WEB-INF/classes"/>
          <property name="exploded.lib" value="${exploded}/WEB-INF/lib"/>
      
          <property name="reports.out" value="${out}/reports"/>
          <property name="junit.out" value="${reports.out}/junit"/>
          <property name="testng.out" value="${reports.out}/testng"/>
      
          <path id="production.class.path">
              <pathelement location="${production.classes}"/>
              <pathelement location="${production.resources}"/>
              <fileset dir="${production.lib}">
                  <include name="**/*.jar"/>
                  <exclude name="**/junit*.jar"/>
                  <exclude name="**/*test*.jar"/>
              </fileset>
          </path>
      
          <path id="test.class.path">                            
              <path refid="production.class.path"/>
              <pathelement location="${test.classes}"/>
              <pathelement location="${test.resources}"/>
              <fileset dir="${test.lib}">
                  <include name="**/junit*.jar"/>
                  <include name="**/*test*.jar"/>
              </fileset>
          </path>
      
          <path id="testng.class.path">
              <fileset dir="${test.lib}">
                  <include name="**/testng*.jar"/>
              </fileset>
          </path>
      
          <available file="${out}" property="outputExists"/>
      
          <target name="clean" description="remove all generated artifacts" if="outputExists">
              <delete dir="${out}" includeEmptyDirs="true"/>
              <delete dir="${reports.out}" includeEmptyDirs="true"/>
          </target>
      
          <target name="create" description="create the output directories" unless="outputExists">
              <mkdir dir="${production.classes}"/>
              <mkdir dir="${test.classes}"/>
              <mkdir dir="${reports.out}"/>
              <mkdir dir="${junit.out}"/>
              <mkdir dir="${testng.out}"/>
              <mkdir dir="${exploded.classes}"/>
              <mkdir dir="${exploded.lib}"/>
          </target>
      
          <target name="compile" description="compile all .java source files" depends="create">
              <!-- Debug output
                      <property name="production.class.path" refid="production.class.path"/>
                      <echo message="${production.class.path}"/>
              -->
              <javac srcdir="src" destdir="${out}/production/${ant.project.name}" debug="on" source="${version}">
                  <classpath refid="production.class.path"/>
                  <include name="**/*.java"/>
                  <exclude name="**/*Test.java"/>
              </javac>
              <javac srcdir="${test.src}" destdir="${out}/test/${ant.project.name}" debug="on" source="${version}">
                  <classpath refid="test.class.path"/>
                  <include name="**/*Test.java"/>
              </javac>
          </target>
      
          <target name="junit-test" description="run all junit tests" depends="compile">
              <!-- Debug output
                      <property name="test.class.path" refid="test.class.path"/>
                      <echo message="${test.class.path}"/>
              -->
              <junit printsummary="yes" haltonfailure="${haltonfailure}">
                  <classpath refid="test.class.path"/>
                  <formatter type="xml"/>
                  <batchtest fork="yes" todir="${junit.out}">
                      <fileset dir="${test.src}">
                          <include name="**/*Test.java"/>
                      </fileset>
                  </batchtest>
              </junit>
              <junitreport todir="${junit.out}">
                  <fileset dir="${junit.out}">
                      <include name="TEST-*.xml"/>
                  </fileset>
                  <report todir="${junit.out}" format="frames"/>
              </junitreport>
          </target>
      
          <taskdef resource="testngtasks" classpathref="testng.class.path"/>
          <target name="testng-test" description="run all testng tests" depends="compile">
              <!-- Debug output
                      <property name="test.class.path" refid="test.class.path"/>
                      <echo message="${test.class.path}"/>
              -->
              <testng classpathref="test.class.path" outputDir="${testng.out}" haltOnFailure="${haltonfailure}" verbose="2" parallel="methods" threadcount="50">
                  <classfileset dir="${out}/test/${ant.project.name}" includes="**/*.class"/>
              </testng>
          </target>
      
          <target name="exploded" description="create exploded deployment" depends="testng-test">
              <copy todir="${exploded.classes}">
                  <fileset dir="${production.classes}"/>
              </copy>
              <copy todir="${exploded.lib}">
                  <fileset dir="${production.lib}"/>
              </copy>
          </target>
      
          <target name="package" description="create package file" depends="exploded">
              <jar destfile="${out}/${ant.project.name}.jar" basedir="${production.classes}" includes="**/*.class"/>
          </target>
      
      </project>
      

      【讨论】:

      • 嗯似乎解决了部分问题,但现在我得到“分叉 Java VM 异常退出。请注意报告中的时间不反映 VM 退出前的时间”
      猜你喜欢
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多