【问题标题】:Ant JUnit job fails to run Spring's tests - Spring class runner not foundAnt JUnit 作业无法运行 Spring 的测试 - 找不到 Spring 类运行器
【发布时间】:2014-04-24 14:14:58
【问题描述】:

我有一个带有 Ivy 依赖管理库的 Eclipse Spring 项目(本地缓存中有 jars)。我写了一些带有@RunWith(SpringJUnit4ClassRunner.class) 注释的JUnit 测试类,我可以在Eclipse 中毫无问题地运行它们。不幸的是,我不能将它们作为 Ant 作业运行。我得到以下异常:

Type org.springframework.test.context.junit4.SpringJUnit4ClassRunner not present
java.lang.TypeNotPresentException: Type org.springframework.test.context.junit4.SpringJUnit4ClassRunner not present
    at com.sun.proxy.$Proxy4.value(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at org.eclipse.ant.internal.launching.remote.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
    at org.eclipse.ant.internal.launching.remote.InternalAntRunner.run(InternalAntRunner.java:424)
    at org.eclipse.ant.internal.launching.remote.InternalAntRunner.main(InternalAntRunner.java:138)
Caused by: java.lang.ClassNotFoundException: org.springframework.test.context.junit4.SpringJUnit4ClassRunner
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:270)
    at java.lang.Class.initAnnotationsIfNecessary(Class.java:3178)
    at java.lang.Class.getAnnotation(Class.java:3137)

看起来 Ant 没有将 Ivy 的缓存放入类路径中。我什至尝试将常春藤缓存的目录放入类路径,但没有结果。我该做什么?

我的常春藤依赖:

<dependencies>
    <dependency org="org.springframework" name="spring-core" rev="3.2.8.RELEASE"/>
    <dependency org="org.springframework" name="spring-jdbc" rev="3.2.8.RELEASE"/>  
    <dependency org="org.springframework" name="spring-tx" rev="3.2.8.RELEASE"/>
    <dependency org="org.springframework" name="spring-test" rev="3.2.8.RELEASE"/>
    <dependency org="mysql" name="mysql-connector-java" rev="5.1.29"/>
    <dependency org="junit" name="junit" rev="4.11"/>
</dependencies>

还有我的 Ant 构建文件:

<?xml version="1.0"?>
<project name="FooBar" basedir="."
    xmlns:ivy="antlib:org.apache.ivy.ant">

    <property name="dir.jar" value="build/jar"/>
    <property name="dir.classes" value="build/classes"/>
    <property name="dir.classes.tests" value="build/tests/classes"/>

    <ivy:cachepath pathid="ivy.classpath" />

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

    <!-- ================================= 
          target: clean              
         ================================= -->
    <target name="clean">
        <delete dir="${dir.jar}"/>
        <delete dir="${dir.classes}"/>
        <delete dir="${dir.classes.tests}"/>
    </target>

    <!-- ================================= 
          target: resolve              
         ================================= -->
    <target name="resolve">
        <ivy:cleancache/>
        <ivy:resolve/>
        <ivy:cachepath pathid="ivy.classpath" />
    </target>

    <!-- - - - - - - - - - - - - - - - - - 
          target: build                      
         - - - - - - - - - - - - - - - - - -->
    <target name="build">
        <mkdir dir="${dir.classes}"/>
        <javac srcdir="src" destdir="${dir.classes}" 
            includeantruntime="false" 
            classpathref="ivy.classpath" />
    </target>

    <!-- - - - - - - - - - - - - - - - - - 
          target: build-tests                      
         - - - - - - - - - - - - - - - - - -->
    <target name="build-tests">
        <mkdir dir="${dir.classes.tests}"/>
        <javac srcdir="test" destdir="${dir.classes.tests}" 
            includeantruntime="false">
            <classpath refid="ivy.classpath"/>
            <classpath refid="classpath"/>
        </javac>
    </target>

    <!-- ================================= 
          target: build-all              
         ================================= -->
    <target name="build-all" depends="clean, build, build-tests" description="Builds all" />

   <!-- ================================= 
          target: clean-test-all              
         ================================= -->
    <target name="clean-test-all" depends="clean, build-all" description="Runs all JUnit tests">
        <junit printsummary="yes" haltonfailure="yes">
            <classpath>
              <dirset dir="${user.home}/.ivy2/cache">
                <include name="**" />
              </dirset>
              <pathelement location="ivy.classpath"/>
              <pathelement location="${dir.classes}"/>
              <pathelement location="${dir.classes.tests}"/>
            </classpath>

            <batchtest fork="yes">
              <fileset dir="junit">
                <include name="**/*Test.java"/>
              </fileset>
            </batchtest>
        </junit>
    </target>   
</project>

【问题讨论】:

  • 不应该 阅读 吗?

标签: java spring ant junit ivy


【解决方案1】:

试试这个:

<junit printsummary="yes" haltonfailure="yes">
    <classpath>
      <dirset dir="${user.home}/.ivy2/cache">
        <include name="**" />
      </dirset>
      <path refid="ivy.classpath"/>  <!-- ivy.classpath is already a path -->
      <pathelement location="${dir.classes}"/>
      <pathelement location="${dir.classes.tests}"/>
    </classpath>

    <batchtest fork="yes">
      <fileset dir="junit">
        <include name="**/*Test.java"/>
      </fileset>
    </batchtest>
</junit>

“ivy.path”已经是路径,所以通过引用传入。

【讨论】:

  • 谢谢!有效。顺便说一句:我正在考虑使用 .
猜你喜欢
  • 2021-09-05
  • 2012-11-09
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多