【问题标题】:How to compile Maven based Java project to run it from command line如何编译基于 Maven 的 Java 项目以从命令行运行它
【发布时间】:2016-07-26 22:37:03
【问题描述】:

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

并且能够执行:

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 即可运行的东西,并且可以移植并在不同的机器上运行。

【问题讨论】:

    标签: java maven cmd compilation executable


    【解决方案1】:

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

    java -jar mybundled.jar
    

    不关心类路径依赖。

    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

    【讨论】:

    • 好吧,这一切都奏效了,但是因为我正在使用位于src/main/config 的一些配置文件,我需要以java -jar target/mybundled.jar 的方式从顶层文件夹运行jar。我会看看如何将它移植到另一台机器上(我担心我有不同的 Java,然后 .jar 可能无法正确运行。实际上有可能在这样不同的机器上运行它吗?)然后将其作为答案
    • 很高兴我能帮上忙。我已在我的帖子中附加了关于您的跨平台问题的评论。
    • 不错的补充。第三项表达了我最关心的问题。在我的特殊情况下,我在远程主机上检查了java --version,它是 1.8,所以截至今天(2016 年 7 月)不会有问题。但感谢您指出该链接以及如何解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    相关资源
    最近更新 更多