【问题标题】:How do I package and run a simple command-line application with dependencies using maven?如何使用 maven 打包和运行具有依赖关系的简单命令行应用程序?
【发布时间】:2011-08-26 19:29:06
【问题描述】:

我对 java 和 maven 都是全新的,所以这可能很简单。

如果我按照这里的 maven2 hello world 说明进行操作:

http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

一切正常。如果我随后更改 pom.xml 以从远程存储库引入依赖项,则此依赖项的文件将存储在 ~/.m2/repository/new-dependency/ 中。

使用hello world 指令中的语法来运行应用程序需要我将依赖项的绝对路径添加到我的类路径(通过设置环境变量或通过命令行开关):

java -cp target/my-app-1.0-SNAPSHOT.jar:/.../.m2/.../new-dependency.jar com.mycompany.app.App

这显然会很快变得笨拙:)

我怀疑这不是运行 java 程序的常用方式,我只需要阅读更多关于 .jar 文件的信息,但在我这样做的同时,我会很感激有关如何正确执行此操作的任何提示。

顺便说一句,我没有使用 IDE。 vim 从命令行。

谢谢!

迈克。

【问题讨论】:

    标签: java maven-2 maven


    【解决方案1】:

    您可以使用 maven 本身来运行它,我相信它会为您设置类路径。

    mvn compile
    

    将编译它 然后你运行:

    mvn exec:java -Dexec.mainClass="com.mycompany.app.App"  
    

    它将执行它。

    您可以查看http://www.vineetmanohar.com/2009/11/3-ways-to-run-java-main-from-maven/ 以获取有关运行方式的更多信息(包括将命令行参数传递给您要运行的东西)

    【讨论】:

      【解决方案2】:

      您可以通过将 Main-Class 属性添加到其清单文件来使 jar 可执行。在 Maven 中,这是由归档插件完成的。要添加 Main-Class 属性,请将其添加到您的 pom.xml:

       <build>
         <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>        
            <configuration>
              <archive>
                <manifest>
                  <addClasspath>true</addClasspath>
                  <mainClass>com.mycompany.app.App</mainClass>
                </manifest>
              </archive>
            </configuration>
          </plugin>
        </plugins>
       </build>
      

      您现在可以使用以下命令运行您的 jar:java -jar myjar.jar 或双击它(并非在所有平台上都可用)。

      【讨论】:

      • 为了使这个解决方案工作,我需要将 classpathMavenRepositoryLayout=true 和 classpathPrefix=/home/.../.m2/repository/ 添加到清单部分,因为默认行为是只输入清单中的 jar(不引用它在文件系统中的位置)。
      • 是的,默认行为期望依赖项位于主 jar 的同一目录中。由于您对本地 repo 有依赖关系,因此使用您的解决方案,jar 可以从系统中的任何位置运行。
      【解决方案3】:

      如果你想让它对你和其他人来说简单,那么你可以使用 maven-assembly-plugin 生成一个包含所有依赖项的 jar。示例在这里:http://maven.apache.org/plugins/maven-assembly-plugin/usage.html,执行部分:构建程序集

      【讨论】:

        【解决方案4】:

        您可以使用maven-shade-plugin,它将创建一个包含所有依赖项的可执行超级战争。

        使用appassembler-plugin 创建一个脚本来导入所有依赖项并让您从命令行执行一个主类。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-07
        • 2021-05-25
        • 1970-01-01
        • 2016-01-25
        • 2010-10-09
        相关资源
        最近更新 更多