如何使用 Maven 执行程序?

我希望 Maven 的目标能够触发 Java 类的执行。我正在尝试通过 Makefile迁移线路:

neotest:
mvn exec:java -Dexec.mainClass="org.dhappy.test.NeoTraverse"

我想 mvn neotest生产什么 make neotest目前所做的。

执行插件文档Maven Ant 任务页面都没有任何直接的例子。

目前,我在:

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.1</version>
<executions><execution>
<goals><goal>java</goal></goals>
</execution></executions>
<configuration>
<mainClass>org.dhappy.test.NeoTraverse</mainClass>
</configuration>
</plugin>

但是,我不知道如何从命令行触发插件。

242479 次浏览

使用您为 exec-maven-plugin 定义的 全球配置全球配置:

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.4.0</version>
<configuration>
<mainClass>org.dhappy.test.NeoTraverse</mainClass>
</configuration>
</plugin>

在命令行上调用 mvn exec:java将调用被配置为执行类 org.dhappy.test.NeoTraverse的插件。

因此,要从命令行触发插件,只需运行:

mvn exec:java

现在,如果您希望执行 exec:java目标作为标准构建的一部分,那么您需要将该目标绑定到 默认生命周期的特定 阶段。为此,在 execution元素中声明要将目标绑定到的 phase:

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<id>my-execution</id>
<phase>package</phase>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>org.dhappy.test.NeoTraverse</mainClass>
</configuration>
</plugin>

在这个例子中,类将在 package阶段执行。这只是一个例子,调整它来适应你的需要。也可以与插件版本1.1一起工作。

为了执行多个程序,我还需要一个 profiles部分:

<profiles>
<profile>
<id>traverse</id>
<activation>
<property>
<name>traverse</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<configuration>
<executable>java</executable>
<arguments>
<argument>-classpath</argument>
<argument>org.dhappy.test.NeoTraverse</argument>
</arguments>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>

然后,这个命令可以执行为:

mvn exec:exec -Ptraverse

更好地使用 maven-antrun-plugin。它允许使用更灵活的方式调用您想要的内容。 如果你需要得到它(工具和所有必需的依赖项)出现在类路径只需添加它作为插件依赖项。在最终的 jar 构建过程中(如果您构建了它) ,这种依赖关系将不会被发现。它们被添加到 maven.plugin.classspath 中,只用于执行插件。 我记得我们在 maven-exec 插件上遇到了一些麻烦。它只能找到作为整个 pom 文件的依赖项添加的依赖项,而不想使用插件的运行时依赖项(类似的东西)。 不管怎样,别说了,让我们来看看下面的例子:

<artifactId>maven-antrun-plugin</artifactId>
<dependencies>
<dependency>
<groupId>x.y.z.codegen</groupId>
<artifactId>Generator-Project</artifactId>
<version>${generator.project.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>Code generation</id>
<phase>generate-sources</phase>
<configuration>
<target>
<parallel threadsPerProcessor="2">
<java classname="x.y.z.codegen.ObjectModelCodeGenerator" fork="true" failonerror="true">
<classpath>
<path refid="maven.plugin.classpath"/>
</classpath>
<jvmarg value="-Duser.dir=${generator.root}"/>
<arg value="arg1"/>
<arg value="arg2"/>
<arg value="arg3"/>
</java>
<java classname="x.y.z.codegen.ObjectModelCodeGenerator" fork="true" failonerror="true">
<classpath>
<path refid="maven.plugin.classpath"/>
</classpath>
<jvmarg value="-Duser.dir=${generator.root}"/>
<arg value="arg1"/>
<arg value="arg2"/>
<arg value="arg3"/>
</java>
</parallel>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>

另外,你可以看到我在这里使用了并行执行。 如果您的工具可以并行调用,那么就可以完成。 这种可能性在 maven-antrun-plugin 1.8中存在,但是在最近的版本中很多,这意味着并行执行不会发生。