我正在创建一个Maven原型,我正在研究其他原型的来源。
我能够找出how files and folders are created和how substitution occurs within files of an archetype。
现在我想编写一些代码,这些代码在原型运行新项目时运行,操作复制的文件并执行其他操作。
我该怎么做? guide to making archetypes似乎过时了,从未提及过。{/ p>
答案 0 :(得分:2)
我使用了archetype maven插件的属性-Dgoal。在此属性中,您可以指定其他目标,以便立即在从原型创建的项目上运行。
所以,我在maven原型项目中创建了一个新的maven插件模块,这个模块包含了我想要执行的所有其他java逻辑。我不需要在生成的项目的新创建的pom.xml中指定此插件。
更多细节:这是maven-plugin的pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>yourGroupId</groupId>
<artifactId>init-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>maven-plugin</packaging>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.0.4</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-project</artifactId>
<version>3.0-alpha-2</version>
</dependency>
</dependencies>
这是Mojo:
/**
* @goal maven-plugin-init
*/
public class InitMojo extends AbstractMojo
{
/**
* @parameter expression="${project.basedir}"
*/
private File basedir;
public void execute() throws MojoExecutionException, MojoFailureException
{
//write initialization logic here
}
}
所以,在&#34; basedir&#34;将成为新创建的项目的基础。
唯一的问题是如何将我们的原型的输入参数传递给我们的初始化插件。我只是使用archetype创建一个文件&#34; initial.properties&#34;在新创建的项目的根目录中,存储所有输入参数。然后在初始化插件中读取此文件。
要启动您的原型,请使用以下命令:mvn archetype:generate $archetype_properties -Dgoals=yourGroupId:init-maven-plugin:maven-plugin-init
答案 1 :(得分:0)
诉Artyukhov是对的,但你想要做的事情(修改文件等)很容易通过使用-Dgoals来完成:antrun:用下面的pom运行。你不需要自己的插件。 Ant在这里有意义,因为您可以在一个语句中将许多文件操作放在一起。注意id default-cli ,这使得在使用命令行时进行执行(如-Dgoals那样)。
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>default-cli</id>
<configuration>
<target>
<ant antfile="src/ant/custom.xml" inheritRefs="true">
<property name="customGroupId" value="${customGroupId}"/>
<property name="customArtifactId" value="${customArtifactId}"/>
<property name="customVersion" value="${customVersion}"/>
</ant>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>