例
项目包含以下文件:
├── 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.xmlresolve:[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.htmlresources: [copy] Copying 1 file to /home/mark/Files/Dev/ivy/demo/build/classescompile: [javac] Compiling 1 source file to /home/mark/Files/Dev/ivy/demo/build/classescompile-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-classestest: [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 secbuild:[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.jarBUILD SUCCESSFULTotal time: 4 seconds
常春藤
常春藤的一个非常强大的功能是配置。这些使您可以将依赖项分组在一起。
<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”属性。这是从本地到远程的映射。有关ivy如何管理远程Maven模块的更多详细信息,请参见:ivy如何将maven范围映射到ivy配置
build.xml
常春藤配置可以被诸如cachepath(创建ANT路径)和检索(将文件复制到构建中)之类的任务所利用。我还建议使用报告目标,以便您可以查看每种配置中出现了哪些jar(用于管理传递依赖项)
<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 pre"> <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="**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 pre"> <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>注意:
有条件的“ install-ivy”目标将自动安装ivy。只需重新运行构建,只需完成一次。
App.java
你好世界记录示例。
package org.demo;import org.slf4j.Logger;import org.slf4j.LoggerFactory;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断言。
ackage org.demo;import junit.framework.Test;import junit.framework.TestCase;import junit.framework.TestSuite;public class AppTest extends TestCase{ public AppTest( String testName ) { super( testName ); } public static Test suite() { return new TestSuite( AppTest.class ); } 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.PatternLayoutlog4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n


