问题描述
我试图得到一个简单的(?)的测试项目有蚂蚁,常春藤和JUnit工作。的基本思想是,常春藤将下载的junit.jar然后Ant将使用它。
I am trying to get a simple(?) test project working with Ant, Ivy and JUnit. The basic idea is that Ivy will download junit.jar and then Ant will use it.
注意的 JUnit的罐子在classpath中的,否则(没有在junit任务的的classpath
元素)我看的<类路径>为<的junit>必须包括的junit.jar如果不是在Ant的自己的类路径。此外,以下(junit.framework.TestListener)给出的类是在JUnit-4.8.2.jar。
Note that the junit jar is on the classpath because otherwise (without the classpath
element in the junit task) I see "The <classpath> for <junit> must include junit.jar if not in Ant's own classpath". Also, the class given below (junit.framework.TestListener) is in junit-4.8.2.jar.
然而,当我尝试蚂蚁测试
上我看到以下内容:
However, when I try ant test
on the following I see:
test:
BUILD FAILED
/home/andrew/project/guice/hg/build.xml:33: java.lang.NoClassDefFoundError: junit/framework/TestListener
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
...
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
Caused by: java.lang.ClassNotFoundException: junit.framework.TestListener
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
...
所以,我想的东西是错误与我的build.xml?什么?
So I guess something is wrong with my build.xml? What?
下面是build.xml文件:
Here is the build.xml:
<project xmlns:ivy="antlib:org.apache.ivy.ant"
name="java-example" default="dist" basedir=".">
<description>
simple example build file
</description>
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="dist" location="dist"/>
<property name="lib" location="lib"/>
<path id="lib.path">
<fileset dir="${lib}"/>
</path>
<target name="init">
<tstamp/>
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init,resolve"
description="compile the source">
<javac srcdir="${src}" destdir="${build}" classpathref="lib.path"
includeantruntime="false">
<compilerarg value="-Xlint"/>
</javac>
</target>
<target name="test" depends="compile"
description="run the tests">
<junit>
<classpath refid="lib.path"/>
<batchtest>
<fileset dir="${build}">
<include name="**/*Test.class"/>
</fileset>
</batchtest>
</junit>
</target>
<target name="dist" depends="compile"
description="generate the distribution">
<mkdir dir="${dist}/lib"/>
<jar jarfile="${dist}/lib/example-${DSTAMP}.jar" basedir="${build}"/>
</target>
<target name="clean"
description="clean up">
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
<target name="resolve"
description="download required dependencies">
<ivy:retrieve/>
</target>
</project>
和编译后现有的目录结构:
and the existing directory structure after compilation:
.
├── build
│ └── com
│ └── isti
│ └── example
│ ├── AppendToList.class
│ ├── DumpToStdout.class
│ ├── LimitedCounter.class
│ ├── MessageSink.class
│ ├── MessageSource.class
│ └── SinkToSourceTest.class
├── build.xml
├── dist
│ └── lib
│ └── example-20130412.jar
├── ivy.xml
├── lib
│ ├── junit-4.8.2.jar
│ ├── junit-4.8.2-javadoc.jar
│ └── junit-4.8.2-sources.jar
├── README.md
└── src
├── main
│ └── java
│ └── com
│ └── isti
│ └── example
│ ├── AppendToList.java
│ ├── DumpToStdout.java
│ ├── LimitedCounter.java
│ ├── MessageSink.java
│ └── MessageSource.java
└── test
└── java
└── com
└── isti
└── example
└── SinkToSourceTest.java
更新顺便说一句,蚂蚁-lib LIB测试
(显式地给予lib目录)的作品。而且有很多的这种随机的网页搜索结果的处理混淆的描述 - 但我的IM pression是,上面的方法是用的(我用蚂蚁1.9) - 见点5。所以我想这可能是一个的; 。
Update Incidentally, ant -lib lib test
(explicitly giving the lib directory) works. And there are lots of confused descriptions of the handling of this in random web search results - but my impression is that the approach above is consistent with the latest docs (I am using ant 1.9) - see point 5. So I am thinking this may be a bug; bug.
推荐答案
项目包含以下文件:
├── build.xml
├── ivy.xml
└── src
├── main
│ ├── java
│ │ └── org
│ │ └── demo
│ │ └── App.java
│ └── resources
│ └── log4j.properties
└── test
└── java
└── org
└── demo
└── AppTest.java
构建运行如下:
$ ant
Buildfile: /home/mark/Files/Dev/ivy/demo/build.xml
resolve:
[ivy:resolve] :: Apache Ivy 2.3.0 - 20130110142753 :: http://ant.apache.org/ivy/ ::
[ivy:resolve] :: loading settings :: url = jar:file:/home/mark/.ant/lib/ivy.jar!/org/apache/ivy/core/settings/ivysettings.xml
[ivy:resolve] :: resolving dependencies :: com.myspotontheweb#demo;working@mark-Lemur-Ultra
[ivy:resolve] confs: [compile, runtime, test]
[ivy:resolve] found org.slf4j#slf4j-api;1.7.5 in public
[ivy:resolve] found org.slf4j#slf4j-log4j12;1.7.5 in public
[ivy:resolve] found log4j#log4j;1.2.17 in public
[ivy:resolve] found junit#junit;4.11 in public
[ivy:resolve] found org.hamcrest#hamcrest-core;1.3 in public
[ivy:resolve] :: resolution report :: resolve 347ms :: artifacts dl 14ms
---------------------------------------------------------------------
| | modules || artifacts |
| conf | number| search|dwnlded|evicted|| number|dwnlded|
---------------------------------------------------------------------
| compile | 1 | 0 | 0 | 0 || 1 | 0 |
| runtime | 3 | 0 | 0 | 0 || 3 | 0 |
| test | 5 | 0 | 0 | 0 || 5 | 0 |
---------------------------------------------------------------------
[ivy:report] Processing /home/mark/.ivy2/cache/com.myspotontheweb-demo-compile.xml to /home/mark/Files/Dev/ivy/demo/build/ivy-reports/com.myspotontheweb-demo-compile.html
[ivy:report] Processing /home/mark/.ivy2/cache/com.myspotontheweb-demo-runtime.xml to /home/mark/Files/Dev/ivy/demo/build/ivy-reports/com.myspotontheweb-demo-runtime.html
[ivy:report] Processing /home/mark/.ivy2/cache/com.myspotontheweb-demo-test.xml to /home/mark/Files/Dev/ivy/demo/build/ivy-reports/com.myspotontheweb-demo-test.html
resources:
[copy] Copying 1 file to /home/mark/Files/Dev/ivy/demo/build/classes
compile:
[javac] Compiling 1 source file to /home/mark/Files/Dev/ivy/demo/build/classes
compile-tests:
[mkdir] Created dir: /home/mark/Files/Dev/ivy/demo/build/test-classes
[javac] Compiling 1 source file to /home/mark/Files/Dev/ivy/demo/build/test-classes
test:
[mkdir] Created dir: /home/mark/Files/Dev/ivy/demo/build/test-reports
[junit] Running org.demo.AppTest
[junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.085 sec
build:
[ivy:retrieve] :: retrieving :: com.myspotontheweb#demo
[ivy:retrieve] confs: [runtime]
[ivy:retrieve] 3 artifacts copied, 0 already retrieved (512kB/16ms)
[jar] Building jar: /home/mark/Files/Dev/ivy/demo/build/dist/demo.jar
BUILD SUCCESSFUL
Total time: 4 seconds
的ivy.xml
常春藤的一个非常强大的功能是。这允许你组依赖关系在一起。
ivy.xml
A very powerful feature of ivy is configurations. These allow you to group dependencies together.
<ivy-module version="2.0">
<info organisation="com.myspotontheweb" module="demo"/>
<configurations>
<conf name="compile" description="Required to compile application"/>
<conf name="runtime" description="Additional run-time dependencies" extends="compile"/>
<conf name="test" description="Required for test only" extends="runtime"/>
</configurations>
<dependencies>
<!-- compile dependencies -->
<dependency org="org.slf4j" name="slf4j-api" rev="1.7.5" conf="compile->default"/>
<!-- runtime dependencies -->
<dependency org="org.slf4j" name="slf4j-log4j12" rev="1.7.5" conf="runtime->default"/>
<!-- test dependencies -->
<dependency org="junit" name="junit" rev="4.11" conf="test->default"/>
</dependencies>
</ivy-module>
注:
- 的配置使用,以模拟Maven的编译,运行和测试的Maven范围的扩展功能。
- 请注意每个依赖特殊的CONF属性。这是从本地到远程的映射。有关如何远程Maven模块的更多细节由常春藤看管理:How被行家范围由常春藤映射到常春藤配置
- The configurations use the "extends" feature in order to emulate the Maven "compile", "runtime" and "test" Maven scopes.
- Note the special "conf" attribute on each dependency. This is the mapping from local to remote. For more details on how remote Maven modules are managed by ivy see: How are maven scopes mapped to ivy configurations by ivy
常春藤配置都可以用(将文件复制到你的版本)。
我还建议使用目标,这样就可以看哪个罐子出现在每个配置(可用来管理传递依赖)
Ivy configurations can be leveraged by tasks like cachepath (to create an ANT path) and retrieve (copy files into your build).I also recommend using the report target so that you can see which jars appear in each configuration (Useful to managing transitive dependencies)
<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">
<!--
================
Build properties
================
-->
<property name="src.dir" location="src/main/java"/>
<property name="resources.dir" location="src/main/resources"/>
<property name="test.src.dir" location="src/test/java"/>
<property name="build.dir" location="build"/>
<property name="classes.dir" location="${build.dir}/classes"/>
<property name="test.classes.dir" location="${build.dir}/test-classes"/>
<property name="ivy.reports.dir" location="${build.dir}/ivy-reports"/>
<property name="test.reports.dir" location="${build.dir}/test-reports"/>
<property name="dist.dir" location="${build.dir}/dist"/>
<property name="jar.main.class" value="org.demo.App"/>
<property name="jar.file" value="${dist.dir}/${ant.project.name}.jar"/>
<available classname="org.apache.ivy.Main" property="ivy.installed"/>
<!--
===========
Build setup
===========
-->
<target name="install-ivy" description="Install ivy" unless="ivy.installed">
<mkdir dir="${user.home}/.ant/lib"/>
<get dest="${user.home}/.ant/lib/ivy.jar" src="http://search.maven.org/remotecontent?filepath=org/apache/ivy/ivy/2.3.0/ivy-2.3.0.jar"/>
<fail message="Ivy has been installed. Run the build again"/>
</target>
<target name="resolve" depends="install-ivy" description="Use ivy to resolve classpaths">
<ivy:resolve/>
<ivy:report todir='${ivy.reports.dir}' graph='false' xml='false'/>
<ivy:cachepath pathid="compile.path" conf="compile"/>
<ivy:cachepath pathid="test.path" conf="test"/>
</target>
<!--
===============
Compile targets
===============
-->
<target name="resources" description="Copy resources into classpath">
<copy todir="${classes.dir}">
<fileset dir="${resources.dir}"/>
</copy>
</target>
<target name="compile" depends="resolve,resources" description="Compile code">
<mkdir dir="${classes.dir}"/>
<javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="false" debug="true" classpathref="compile.path"/>
</target>
<target name="compile-tests" depends="compile" description="Compile tests">
<mkdir dir="${test.classes.dir}"/>
<javac srcdir="${test.src.dir}" destdir="${test.classes.dir}" includeantruntime="false" debug="true">
<classpath>
<path refid="test.path"/>
<pathelement path="${classes.dir}"/>
</classpath>
</javac>
</target>
<!--
============
Test targets
============
-->
<target name="test" depends="compile-tests" description="Run unit tests">
<mkdir dir="${test.reports.dir}"/>
<junit printsummary="yes" haltonfailure="yes">
<classpath>
<path refid="test.path"/>
<pathelement path="${classes.dir}"/>
<pathelement path="${test.classes.dir}"/>
</classpath>
<formatter type="xml"/>
<batchtest fork="yes" todir="${test.reports.dir}">
<fileset dir="${test.src.dir}">
<include name="**/*Test*.java"/>
<exclude name="**/AllTests.java"/>
</fileset>
</batchtest>
</junit>
</target>
<!--
=====================
Build and run targets
=====================
-->
<target name="build" depends="test" description="Create executable jar archive">
<ivy:retrieve pattern="${dist.dir}/lib/[artifact]-[revision](-[classifier]).[ext]" conf="runtime"/>
<manifestclasspath property="jar.classpath" jarfile="${jar.file}">
<classpath>
<fileset dir="${dist.dir}/lib" includes="*.jar"/>
</classpath>
</manifestclasspath>
<jar destfile="${jar.file}" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="${jar.main.class}" />
<attribute name="Class-Path" value="${jar.classpath}" />
</manifest>
</jar>
</target>
<target name="run" depends="build" description="Run code">
<java jar="${jar.file}" fork="true"/>
</target>
<!--
=============
Clean targets
=============
-->
<target name="clean" description="Cleanup build files">
<delete dir="${build.dir}"/>
</target>
<target name="clean-all" depends="clean" description="Additionally purge ivy cache">
<ivy:cleancache/>
</target>
</project>
请注意:
- 有条件的安装-常春藤的目标会自动安装常春藤。只是重新运行构建,只需要进行一次。
您好世界记录的例子。
package org.demo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Hello world!
*
*/
public class App {
static final Logger log = LoggerFactory.getLogger(App.class);
public static void main( String[] args ) {
App a = new App();
a.speak("hello world");
}
public void speak(String message) {
log.info(message);
}
}
AppTest.java
这是从我的档案旧的例子。不使用JUnit断言。
AppTest.java
This is an old example from my archives. Not using the Junit assertions.
ackage org.demo;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
* Unit test for simple App.
*/
public class AppTest
extends TestCase
{
/**
* Create the test case
*
* @param testName name of the test case
*/
public AppTest( String testName )
{
super( testName );
}
/**
* @return the suite of tests being tested
*/
public static Test suite()
{
return new TestSuite( AppTest.class );
}
/**
* Rigourous Test :-)
*/
public void testApp()
{
assertTrue( true );
}
}
log4j.properties
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
这篇关于类未找到与蚂蚁,常春藤和JUnit - 错误的build.xml?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!