mvn exec:java 在外部 JAR 文件中运行 java 文件

Posted

技术标签:

【中文标题】mvn exec:java 在外部 JAR 文件中运行 java 文件【英文标题】:mvn exec:java to run a java file in an external JAR file 【发布时间】:2017-07-09 08:04:39 【问题描述】:

在 pom.xml 中有一个使用 maven-dependency-plugin 将特定的外部 JAR 文件下载到单独的位置(在 /tmp/externalTestJars/testjar.jar 中)。

我想使用exec-maven-plugin 来运行 testjar.jar 文件 (Main.java) 中的 java 类。

我发现 this SO question 提出了同样的问题,但该问题的答案对我没有帮助。

如果我直接运行 Main.java 文件(在创建 .jar 的原始项目中,使用 mvn exec:java)我可以使用下面的 pom 配置。

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
    <mainClass>org.example.Main</mainClass>
    <!-- need to pass two arguments to the Main.java file main method -->
    <arguments>
        <argument>arg one</argument>
        <argument>arg two</argument>
    </arguments>
</configuration>
</plugin>

在上面的 SO 问题中,它有一个类似下面的答案,可以在 .jar 文件中运行 java 文件。

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
    <mainClass>org.example.Main</mainClass>
    <arguments>
        <argument>-jar</argument>
        <argument>/tmp/externalTestJars/testjar.jar</argument>
    </arguments>
</configuration>
</plugin>

但在我的情况下,这些参数将被视为传递给 Main.java 中的主要方法的参数,因为它需要两个参数。所以这种方法对我不起作用。

这可以使用 exec maven 插件来完成,还是有任何其他方法可以做到这一点。

【问题讨论】:

如果 .jar 下载位置对插件无关紧要,这也可能会有所帮助。这样我们就可以将其添加为插件依赖项。 mojohaus.org/exec-maven-plugin/examples/… 【参考方案1】:

如果你想运行类似于java -cp /tmp/externalTestJars/testjar.jar org.example.Main的类,插件应该配置如下。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.3.2</version>
    <configuration>
        <executable>java</executable>
        <arguments>
            <argument>-cp</argument>
            <argument>/tmp/externalTestJars/testjar.jar</argument>
            <argument>org.example.Main</argument>
        </arguments>
    </configuration>
</plugin>

如果你想运行类似于java -jar /tmp/externalTestJars/testjar.jar的类(假设org.example.MainMANIFEST.MF中定义为Main-Class)插件应该配置如下。

<configuration>
    <executable>java</executable>
    <arguments>
        <argument>-jar</argument>
        <argument>/tmp/externalTestJars/testjar.jar</argument>
    </arguments>
</configuration>

在这两种情况下都使用mvn exec:exec 运行它

编辑:使用mvn exec:java的示例。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.3.2</version>
    <executions>
        <execution>
            <phase>install</phase>
            <goals>
                <goal>java</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <mainClass>org.example.Main</mainClass>
        <additionalClasspathElements>
            <additionalClasspathElement>
                /tmp/externalTestJars/testjar.jar
            </additionalClasspathElement>
        </additionalClasspathElements>
    </configuration>
</plugin>

注意:如果项目和 jar 文件 testjar.jar 都包含类 org.example.Main,则项目中的类将被执行。由于additionalClasspathElement 定义的类路径元素将附加到项目类路径中。

【讨论】:

很好 (Y) 这似乎是问题的解决方案。谢谢。 顺便说一句,我们可以为 mvn exec:java 实现这一点,以便我们可以在 pom 中设置 Main 类。 @prime 查看exec:java 的示例。 太棒了。关于您关于在项目和 .jar 中具有相同类的注释,我确实发现了这一点。 mojohaus.org/exec-maven-plugin/examples/… @prime 这取决于您想要实现的目标。在您的问题中,您讲述了一个外部 Jar 文件,该文件不属于项目的一部分。您评论中的链接谈到了 Maven 托管依赖项。

以上是关于mvn exec:java 在外部 JAR 文件中运行 java 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用反射在外部JAR / CLASS上调用包含Hibernate事务的方法(Java EE)

一个项目软件的大小基本都占用在外部引用的jar包上了。

传递到 mvn exec:java 时保留参数间距等

spring boot6.idea下springboot打包成jar包和war包,并且可以在外部tomcat下运行访问到

消费者被配置为查找与 Java 8 兼容的组件的运行时,打包为 jar,其依赖项在外部声明,但是:

docker 在外部指定参数变量