如何从命令行将基于 Maven 的 Java 项目编译为 运行

How to compile Maven based Java project to run it from command line

我有一个 Maven 项目,我需要以某种方式对其进行编译,以便我能够将编译后的文件传输到不同的机器,然后在那里执行(可能具有不同的 Java 版本)。 我看了这个

并且能够执行:

mvn clean install
mvn dependency:copy-dependencies

然而当我尝试时:

cd target/
java -cp myApp-0.0.1.jar:dependency myApp

我得到了

Error: Could not find or load main class myApp

我的 pom.xml 没有 mvn-assembly-plugin 或 maven-jar-plugin(我在 mvn clean install 后成功地在 target/ 中获取了 .jar)。

我不确定这些步骤是否与我的目标相关,因为我需要的是创建一些 运行 没有任何 java -jar 或 mvn 并且可以移植和 运行 在另一台机器上。

有一个 Maven 构建插件可以将所有依赖项捆绑在一个 JAR 中。你可以简单地用

来执行它
java -jar mybundled.jar

不关心 class 路径依赖。

Maven 插件来了。将 MainClass 替换为您的入口点。

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-assembly-plugin</artifactId>
   <version>2.4.1</version>
   <configuration>
      <descriptorRefs>
         <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>       
      <archive>
        <manifest>
          <mainClass>com.yourdomain.Main</mainClass>
        </manifest>
      </archive>
     </configuration>
    <executions>
      <execution>
         <id>make-assembly</id>
         <phase>package</phase>
         <goals>
           <goal>single</goal>
         </goals>
       </execution>
    </executions>
</plugin>

因为它绑定到 package lifecycle,您会在执行以下操作后在目标目录中找到捆绑的 JAR ...

mvn package

关于您担心您的代码不会 运行 在另一台机器上的问题,Java 与平台无关,通常 您可以信赖这一点。然而,我想到了三件事会让生活变得艰难:

  1. 您的代码取决于系统编码。 Maven 应该会在日志中就此向您发出警告,建议您明确指定它。
  2. 您与 运行时间进行交互,例如执行系统命令。 ps 不适用于 windows 并且 dir /s 可能不适用于 *nix。
  3. 您的 Java 环境版本不同。当然,JavaFX 代码不会 运行 与 Java 1.5。如果您使用最新的功能,请确保您的客户已经拥有相应的版本,或者至少能够从某个地方获得它。您可能还想看看 sourcetarget 编译选项:http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#crosscomp-example