有没有一种好方法可以使用maven来运行可执行jar?

2022-09-03 00:19:41

我有一个多模块maven项目,其中一个模块是用于分发的。

Project \
| moduleA \
| moduleB \
| ...
| dist-module \

该发行版包含一个可执行的jar,我想轻松执行。但是,要执行它,我必须键入如下内容:

java -jar dist-module/target/dist-module-1.0-SNAPSHOT-full-dist/myJar.jar

最好直接键入:

mvn exec:java \ OR
mvn exec:exec

不幸的是,我找不到一种方法来让java目标执行.jar。exec的目标实际上会做到这一点,但有一个问题:jar包含一个嵌入式码头服务器,并且由于exec的工作方式(不使用与maven相同的JVM),除非我手动终止进程,否则服务器不会终止,这同样令人烦恼。

有关如何使用maven执行此操作的任何建议?

编辑:
为了澄清,此命令将主要用于简单的手动烟雾测试;读取日志输出并确保程序在其分发环境中正确启动。因此,它应该是一个阻塞调用,ctrl-c 同时终止服务器和 maven。

嵌入式服务器专门用于运行一些特定的应用程序,并且不会自动重新加载它们。因此,没有必要长时间保持服务器独立于maven运行。


答案 1

mvn exec:java 直接从 target/ 下面的编译器输出运行应用程序 - 无需从 jar 运行:

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.2.1</version>
        <executions>
            <execution>
                <id>default-cli</id>
                <goals>
                    <goal>java</goal>
                </goals>
                <configuration>
                    <mainClass>uk.co.pookey.hibernate.App</mainClass>
                    <systemProperties>
                        <systemProperty>
                            <key>derby.stream.error.file</key>
                            <value>${basedir}/target/derby.log</value>
                        </systemProperty>
                    </systemProperties>
                </configuration>
            </execution>
        </executions>
    </plugin>            

如果你想用 mvn exec:exec 运行 jar:

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.2.1</version>
        <executions>
            <execution>
                <id>default-cli</id>
                <goals>
                    <goal>exec</goal>
                </goals>
                <configuration>
                    <executable>java</executable>
                    <!-- optional -->
                    <workingDirectory>/tmp</workingDirectory>
                    <arguments>
                        <argument>-jar</argument>
                        <argument>${basedir}/target/hibernate-derby-memory-${project.version}.jar</argument>
                    </arguments>
                </configuration>                        
            </execution>
        </executions>
    </plugin>         

如果您在码头终止时遇到问题,我建议您运行集成测试(或者只是不要在没有先终止码头的情况下退出码头主线程,或者只是使用码头的停止端口)!可以在后台运行JVM,并让maven在测试后再次停止它。这有三个阶段:集成测试前、集成测试或集成测试后测试。您可以在 http://docs.codehaus.org/display/MAVENUSER/Maven+and+Integration+Testing 阅读更多相关信息。当使用jetty maven插件时,pom.xml配置可以像这样:

   <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <!-- test start/stop: -->
        <executions>                
            <execution>
                <id>start-jetty</id>
                <phase>pre-integration-test</phase>
                <goals>
                    <goal>deploy-war</goal>
                </goals>
                <configuration>
                    <daemon>true</daemon>
                    <systemProperties>
                        <systemProperty>
                            <name>some.prop</name>
                            <value>false</value>
                        </systemProperty>
                    </systemProperties>
                </configuration>
            </execution>
            <execution>
                <id>stop-jetty</id>
                <phase>post-integration-test</phase>
                <goals>
                    <goal>stop</goal>
                </goals>
            </execution>
        </executions>    
    </plugin>

您可以将 maven antrun 插件绑定到这些阶段,而不是将 jetty maven 插件绑定到这些阶段,以执行任意命令。


答案 2

如果你想执行东西,我会使用maven ant或gmaven(然后使用时髦的蚂蚁生成器)

编辑后,这听起来像是你使用了像DropWizard这样的东西。你可能想看看他们是如何解决这个问题的

根据评论进行编辑:

Spring Boot Maven将创建可执行的战争并执行它们,您不需要Spring Boot或Spring。我的答案中有更多细节:spring-boot-maven-plugin可以用于非spring项目吗?


推荐