java - 如何编译基于 Maven 的 Java 项目以从命令行运行它

标签 java maven cmd compilation executable

我有一个 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 即可运行的东西,并且可以移植并在不同的计算机上运行。

最佳答案

有一个 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>

由于它绑定(bind)到包生命周期,因此在执行...后,您会在目标目录中找到捆绑的 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

关于java - 如何编译基于 Maven 的 Java 项目以从命令行运行它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38600954/

相关文章:

java - Maven 属性前缀 "user"和 "maven"有特殊含义吗?

java - 找不到适合 jdbc :oracle:thin:@localhost:1521:XE 的驱动程序

windows - Windows 中用于应用程序白名单的代码签名应用程序

java - 通过由其他代码分隔的 java 运行多个 cmd 命令

java - 具有多个实例的集群中的 JMS 持久订阅者

java - 翻转卡片动画

java - 从 Oracle 触发器启动 Java Web 应用程序中的流程

java - 是否可以向 OpenAPI 添加方法?

cmd - 如何以管理员身份从 Windows 命令行运行命令?

java - 我可以通过 JSON 在运行时动态创建 Java 对象吗?