在构建时动态添加 ant 插件? [英] Add ant plugins dynamically at buildtime?
问题描述
我想建立一个 Ant 构建,在构建时拉下它的插件.例如,如果我的构建使用 findbugs
和 checkstyle
JAR 并从 build.xml 中调用它们的任务,那么理想情况下我可以:
I'd like to set up an Ant build that pulls down its plugins at buildtime. So for instance, if my build used findbugs
and checkstyle
JARs and called their tasks from inside build.xml, then ideally I could:
- 运行
ivy-resolve
和ivy-retrieve
任务将findbugs
和checkstyle
JAR 拉入,比如说,gen/lib/buildtime
. - 将
gen/lib/buildtime
添加到 Ant 的类路径 - 定义
定义各种findbugs
和checkstyle
任务 - 在下游目标中执行
findbugs
和checkstyle
任务
- Run an
ivy-resolve
andivy-retrieve
task to pullfindbugs
andcheckstyle
JARs down into, say,gen/lib/buildtime
. - Add
gen/lib/buildtime
to Ant's classpath - Define
<taskdefs>
that define the variousfindbugs
andcheckstyle
tasks - Execute the
findbugs
andcheckstyle
tasks in a downstream target
这可能吗?如果是这样,如何?我认为这里唯一的阻碍是我认为您不能动态添加 <taskdefs>
...提前致谢!
Is this possible? If so, how? I think the only show-stopper here is the fact that I don't think you can dynamically add <taskdefs>
... thanks in advance!
推荐答案
最好的方法是使用 cachepath 任务以使用所需的 jar 填充 ANT 路径.然后你的 taskdef 变成:
The best approach is to use the cachepath task to populate an ANT path with the required jars. Your taskdef then becomes:
<ivy:cachepath pathid="build.path" conf="build"/>
<taskdef uri="antlib:org???" resource="???" classpathref="build.path"/>
常春藤配置可用于控制哪些 jar 应填充路径.
An ivy configuration can be used to control which jars should populate the path.
以下示例使用 Sonar 自动运行 findbugs 和 checkstyle.它演示了使用 ivy 引入以下 ANT 插件:
The following example uses Sonar to run findbugs and checkstyle automatically. It demonstrates using ivy to pull in the following ANT plugins:
- junit
- 声纳
- 雅可
├── build.properties
├── build.xml
├── ivy.xml
└── src
├── main
│ └── java
│ └── org
│ └── demo
│ └── App.java
└── test
└── java
└── org
└── demo
└── AppTest.java
ivy.xml
<ivy-module version="2.0">
<info organisation="com.myspotontheweb" module="demo"/>
<configurations defaultconfmapping="compile->default">
<conf name="compile" description="Required to compile application"/>
<conf name="test" description="Required for test only" extends="compile"/>
<conf name="build" description="Build dependencies"/>
</configurations>
<dependencies>
<!-- compile dependencies -->
<!-- test dependencies -->
<dependency org="junit" name="junit" rev="4.10" conf="test->default"/>
<!-- build dependencies -->
<dependency org="org.codehaus.sonar-plugins" name="sonar-ant-task" rev="2.1" conf="build->default"/>
<dependency org="org.jacoco" name="org.jacoco.ant" rev="0.6.3.201306030806" conf="build->default"/>
<!-- Global exclusions -->
<exclude org="org.apache.ant"/>
</dependencies>
</ivy-module>
build.xml
<project name="demo" default="test" xmlns:ivy="antlib:org.apache.ivy.ant">
<property file="build.properties"/>
<target name="bootstrap" description="Install ivy">
<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"/>
</target>
<target name="resolve" description="Download dependencies and setup classpaths">
<ivy:resolve/>
<ivy:report todir='${reports.dir}/ivy' graph='false' xml='false'/>
<ivy:cachepath pathid="compile.path" conf="compile"/>
<ivy:cachepath pathid="test.path" conf="test"/>
<ivy:cachepath pathid="build.path" conf="build"/>
</target>
<target name="init" depends="resolve" description="Create build directories">
<mkdir dir="${classes.dir}"/>
<mkdir dir="${test.classes.dir}"/>
<mkdir dir="${reports.dir}/junit"/>
</target>
<target name="compile" depends="init" description="Compile source code">
<javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="false" debug="true" classpathref="compile.path"/>
</target>
<target name="compile-tests" depends="compile" description="Compile test source code">
<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>
<target name="test" depends="compile-tests" description="Run unit tests and code coverage reporting">
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml" classpathref="build.path"/>
<jacoco:coverage destfile="${build.dir}/jacoco.exec" xmlns:jacoco="antlib:org.jacoco.ant">
<junit haltonfailure="yes" fork="true">
<classpath>
<path refid="test.path"/>
<pathelement path="${classes.dir}"/>
<pathelement path="${test.classes.dir}"/>
</classpath>
<formatter type="plain" usefile="false" />
<formatter type="xml"/>
<batchtest fork="yes" todir="${reports.dir}/junit">
<fileset dir="${test.src.dir}">
<include name="**/*Test*.java"/>
<exclude name="**/AllTests.java"/>
</fileset>
</batchtest>
</junit>
</jacoco:coverage>
</target>
<target name="sonar" depends="test" description="Upload metrics to Sonar">
<taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml" classpathref="build.path"/>
<ivy:cachepath pathid="sonar.libraries" conf="compile"/>
<sonar:sonar xmlns:sonar="antlib:org.sonar.ant"/>
</target>
<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>
build.properties
# Build properties
build.dir=build
src.dir=src/main/java
test.src.dir=src/test/java
classes.dir=${build.dir}/classes
test.classes.dir=${build.dir}/test-classes
reports.dir=${build.dir}/reports
# Sonar properties
sonar.projectKey=org.demo:demo
sonar.projectName=Demo project
sonar.projectVersion=1.0
sonar.projectDescription=This is my demo Sonar project
sonar.host.url=http://localhost:9000
sonar.jdbc.url=jdbc:h2:tcp://localhost:9092/sonar
sonar.jdbc.driverClassName=org.h2.Driver
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.working.directory=${build.dir}/sonar
sonar.language=java
sonar.sources=${src.dir}
sonar.binaries=${classes.dir}
sonar.tests=${test.src.dir}
sonar.dynamicAnalysis=reuseReports
sonar.surefire.reportsPath=${reports.dir}/junit
sonar.java.coveragePlugin=jacoco
sonar.jacoco.reportPath=${build.dir}/jacoco.exec
这篇关于在构建时动态添加 ant 插件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!