在执行之前先进行Mvn编译。

16

我正在尝试设置我的POM,以便当我执行mvn exec:execmvn exec:java时,它将首先编译源代码,并且如果成功,才执行它。

我已经有了下面的配置,并尝试着移动<execution>部分,但无法使其工作:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
            <executions>
                <execution>
                    <phase>exec</phase>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.2.1</version>
            <configuration>
                <mainClass>my.main.class</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

当我执行mvn exec:exec ...或者mvn exec:java时,它不会首先编译。我尝试将<execution>部分放到exec插件部分,但仍然不能解决问题。


为什么不在执行exec:exec/exec:java之前运行"compiler:compile"呢? - Elad Tabak
2
@Elad 我总是忘记编译,然后感到困惑为什么没有变化。 - Lerp
@Lerp 遇到了同样的问题,你找到解决方案了吗? - Yaroslav
看起来似乎不可能,也许这不是正确的“Maven”方式:/ - Thomas Decaux
"exec" 不是一个阶段,因此您无法将编译插件绑定到它。 - Greg Chabala
3个回答

4

这是一个老话题,但其他人可能会对此有兴趣的另一种解决方案。

虽然不完全符合您的要求,但您可以使用单个命令进行编译和执行:

mvn compile exec:exec

这样 Maven 执行项目之前,总是会先编译它。

2
您可以将 exec 插件绑定到 构建生命周期compile 后的某个阶段(下面示例中为 verify):
<profile>
    <id>proxy</id>
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <executions>
                    <execution>
                        <phase>verify</phase>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <configuration>
                           <mainClass>my.main.class</mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</profile> 

然后运行mvn verify
我看到答案很晚,你可能已经找到解决方案了。我只是留作参考,供其他可能需要的人使用。

9
感谢这个回复,如果我理解正确的话,楼主想要在执行 mvn exec:[exec|java] 命令时进行编译,而不是作为"正常" Maven 构建周期的一部分。为了澄清,他们和我一样,希望代码在运行 'mvn exec' 命令之前先被构建,但 不想在正常的 Maven 构建周期/阶段中运行 'exec'。 - Big Rich

1
这并不能完全回答问题,但它可以帮助我们实现您的主要目标。
在运行mvn exec:java时,我们可以执行mvn exec:java来调用“post-build”阶段/目标,而不是执行build目标。
这将有效地使该阶段无法使用,因为我们将通过执行来代替它,但如果我们有一个未使用的“post-build”目标(如packageinstall),我们可以将其用于执行,如下所示: 使用package目标最终会变成:
...
    <properties>
        ...
        <main.class>${project.groupId}.MainClass</main.class>
        ...
    </properties>
...
    <build>
        <plugins>
...
            <!-- region Forces the app to be executed when using mvn package -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <mainClass>${main.class}</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>java</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <!-- endregion -->
...
        </plugins>
    </build>

当我们使用mvn package命令执行目标package时,插件将被执行并运行应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接