使用Maven时管理构建任务的流行方法是什么?我目前正在使用Maven进行依赖管理,但我需要定义几个可以独立于生命周期执行的“任务”,类似于Ant或Rake提供的内容;只是一个简单的“函数”,只要按名称调用它就会执行一系列步骤。
例如,一个“任务”是从用户提供的文件夹中获取jar
文件,使用mvn install:install-file -DlocalRepositoryPath=repo
命令将其安装在与我的一个maven模块关联的本地Maven存储库中,并将该模块的pom.xml更改为指向jar的新版本。这项任务与生命周期无关,只是做一些特定事情的一般任务,所以我不必手动完成任务,只要输入例如我想要的任何时间就可以执行。 mvn task:update-jar
。
另一个示例是“任务”,它删除我的一个maven模块内的目录内容,然后将内容从用户提供的目录复制到清空目录中。同样,这个任务与Maven或依赖项无关,但不要一直手动完成它。
人们如何编写这些任务 - 这一定是一个常见问题?我知道maven提供了antrun
插件,但据我所知它只能绑定到Maven生命周期阶段,这不是我想要的。除了maven之外我还可以使用带有build.xml文件的Ant,但如果Maven能够以某种方式配置为自己做我想要的东西,那就太愚蠢了。此外,要求BOTH Maven和Ant来管理我的项目似乎不是最佳的。
答案 0 :(得分:1)
如果你坚持让你的构建工作像这样,那么Maven对你来说不是一个正确的选择。
但是,如果您只是想要依赖关系管理,那么您还有其他选择,例如
它们使用Maven存储库直接支持依赖关系管理,但是可以完全控制构建脚本的流程。
答案 1 :(得分:0)
您可以使用maven-antrun-plugin http://maven.apache.org/plugins/maven-antrun-plugin/
所以你可以使用像mvn antrun:run
那样的命令行,其中run是你在pom.xml中定义的目标
使用此插件,您可以混合使用“maven-ant”并在maven中调用ant文件。谨慎使用它,因为您的项目配置可能是一个真正的混乱。
我的项目中用于替换不同文件中的属性的简单示例
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<!-- #1 : call antrun to merge projet with convinient conf files -->
<execution>
<id>replace</id>
<phase>generate-resources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<ant antfile="replace.xml"/>
</tasks>
</configuration>
</execution>
<!-- #2 : call antrun to explode war created in target directory-->
<execution>
<id>unwar</id>
<phase>install</phase>
<configuration>
<tasks>
<!-- add conf folder (was ignored during war creation) -->
<copy todir="./target/${project.artifactId}-${project.version}/conf">
<fileset dir="./conf"/>
</copy>
<!-- rebuild war with conf folder newly added -->
<delete>
<fileset dir="./target">
<include name="${project.artifactId}-${project.version}.war"/>
</fileset>
</delete>
<war basedir="./target/${project.artifactId}-${project.version}" destfile="./target/${project.artifactId}-${project.version}.war" webxml="./target/${project.artifactId}-${project.version}/WEB-INF/web.xml"/>
<!-- copy war and exploded webapp-->
<copy todir="./${project.artifactId}/${project.version}/${project.artifactId}-${project.version}">
<fileset dir="./target/${project.artifactId}-${project.version}"/>
</copy>
<copy file="./target/${project.artifactId}-${project.version}.war" todir="/devef/maven/repository/fr/as/galilei/${project.artifactId}/${project.version}"/>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>ant</groupId>
<artifactId>ant-nodeps</artifactId>
<version>1.6.5</version>
</dependency>
</dependencies>
</plugin>