Java 如何使用maven打包和运行具有依赖关系的简单命令行应用程序?

Java 如何使用maven打包和运行具有依赖关系的简单命令行应用程序?,java,maven-2,maven,Java,Maven 2,Maven,我对java和maven都是全新的,所以这可能非常简单 如果我按照maven2hello world的说明操作: 一切正常。如果随后修改pom.xml以从远程存储库引入依赖项,则此依赖项的文件将存储在~/.m2/repository/new dependency/中 使用hello world指令中的语法运行应用程序需要将依赖项的绝对路径添加到类路径中(通过设置环境变量或通过命令行开关): 这显然会很快变得笨拙:) 我怀疑这不是运行java程序的通常方式,我只需要阅读更多关于.jar文件的内容

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

如果我按照maven2
hello world
的说明操作:

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

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

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

我怀疑这不是运行java程序的通常方式,我只需要阅读更多关于.jar文件的内容,但是在我这样做的同时,我希望能得到一些关于如何正确执行此操作的提示

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

谢谢


Mike。

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

mvn compile
我将编译它 然后你跑:

mvn exec:java -Dexec.mainClass="com.mycompany.app.App"  
这将执行它


您可以查看更多关于运行方式的信息(包括将命令行参数传递给您想要运行的对象)

如果您想让自己和其他人都简单,那么您可以使用maven assembly插件生成一个包含所有依赖项的jar。示例如下:,部分执行:构建程序集

您可以通过将主类属性添加到其清单文件,使jar可执行。在Maven中,这是由archiver插件完成的。要添加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>

org.apache.maven.plugins
maven jar插件
真的
com.mycompany.app.app
现在,您可以使用以下命令运行jar:
java-jar myjar.jar
或双击它(并非在所有平台上都可用)。

您可以使用,它将创建一个具有所有依赖项的可执行uber war


使用创建一个脚本来导入所有依赖项,并允许您从命令行执行一个主类。

我没有尝试shade插件,但appassembler适合我。谢谢appassembler插件ling在2020年1月22日已经失效。新的链接可能是为了使这个解决方案能够工作。我需要将classpathMavenRepositoryLayout=true和classpathPrefix=/home/../...m2/repository/添加到清单部分,这也是因为默认行为只是将jar的名称放在清单中(不引用它在文件系统中的位置)。是的,默认行为期望依赖项位于主jar的同一目录上。由于您对本地repo具有依赖性,因此使用您的解决方案,jar可以从系统中的任何位置运行。
 <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>