【问题标题】:Running JAR with maven-dependencies not contained in this JAR使用此 JAR 中未包含的 maven 依赖项运行 JAR
【发布时间】:2017-02-22 11:39:27
【问题描述】:

所以我有以下问题:

我有一个包含多个 maven 依赖项的 maven 项目。当我运行mvn install 时,它将被打包为 .jar,并且 .jar 与 .pom-File 将一起放置在我的 maven-repository 中。现在,这个 .jar 不包含其他依赖项(也不应该包含!)。现在,鉴于我已经在我的 maven 存储库中安装了所有需要的依赖项(显然 maven 会处理),我如何在命令行上运行这个 jar 而不将类路径设置为指向 maven-repository 中的每个该死的 jar ?还有其他方法吗? mvn exec:java 似乎只在 maven-source 目录中工作,它在其中查找“pom.xml”。但安装后,“pom.xml”变成“name-version.pom”,我有一个 .jar 而不是直接源/类文件。有没有其他方法可以指向mvn exec:java 与 maven 存储库中的 .jar 和 .pom-File 一起使用?或者也许有其他更好的方法来做到这一点?

提前致谢:)

EDIT1:我将把我的评论从下面放在这里以避免进一步的误解:

我不想将依赖项 jar 放在某个地方。我想使用 maven 已经处理好的存储库。理论上,我在本地 maven 存储库中已经拥有了我将需要的所有库。我希望能够下载任何其他 maven 项目,它可能正在使用我已经在本地存储库中安装的一些库,也使用“maven install”安装它,然后删除我下载的源代码,然后执行 .jar由 maven 创建并告诉 java 或 maven(取决于最佳方法是什么)在我的本地 maven 存储库中查找该项目的依赖项。 我希望我说得足够清楚:)

编辑 2:所以我决定使用 mvn install 将项目安装到我的本地 .m2 存储库中,并将项目未打包在某个定义的文件夹中。然后我可以在这些项目中调用 mvn exec:java 来运行它们并maven 将为我解决所有的依赖关系。

【问题讨论】:

  • 你想构建一个包含所有依赖项的包,你可以在任何地方运行吗?
  • 没有。正如我所说:“现在,这个 .jar 不包含其他依赖项(也不应该包含!)”。我希望并且需要它没有依赖关系。这只是一个示例场景。在实际情况下,我将克隆一些其他用户的 maven-projects 并在我的机器上运行它,我不想在我的服务器上存储同一个库 100 次。
  • 如果您想让您的工件可执行,那么您根本无法在不包含 jar 中的依赖项的情况下执行此操作。
  • 使用eclipse或其他IDE,从IDE导入或克隆为maven项目并构建运行,IDE将解析m2存储库中的所有maven依赖。那如果对你没关系就那样做..
  • IDE 没有问题,因为这必须自动发生(由其他脚本调用)。

标签: java maven jar


【解决方案1】:

您可以像这样排除一些您不希望出现在项目中的依赖项 -

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectA</groupId>
      <artifactId>Project-A</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>  <!-- declare the exclusion here -->
          <groupId>sample.ProjectB</groupId>
          <artifactId>Project-B</artifactId>
        </exclusion>
      </exclusions> 
    </dependency>
  </dependencies>
</project>

欲了解更多信息,您可以查看link

【讨论】:

  • 我可能对我打算做什么还不够清楚。这就是为什么我在你回答的同时编辑了这篇文章。也许现在会很清楚了。抱歉,您的回答对我没有任何帮助:(
【解决方案2】:

可以使用 maven-jar-plugin 创建清单文件来使用 maven 制作 Jar 可执行文件并定义类路径依赖项。清单文件通常用于此

例子

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <archive>
                        <manifest>

                            <!-- It define the classpath dependencies -->
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>dependency-jars/</classpathPrefix>

                            <!-- it makes the jar executable -->
                            <mainClass>com.mycompany.App</mainClass>
                        </manifest>

                        <!-- it define some entries about your artifact -->
                        <manifestEntries>
                            <Build-Maven>Maven ${maven.version}</Build-Maven>
                            <Build-Java>${java.version}</Build-Java>
                            <Build-OS>${os.name}</Build-OS>
                            <Build-Label>${project.version}</Build-Label>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>

当您运行命令 mvn package|install 时,将创建以下 meta-inf/manifest.mf 文件并将其添加到 Jar 中。

如果您需要将依赖项 jar 放在某个地方,这可以轻松完成,您将使用 maven-dependency-plugin 将项目依赖项复制到您想要的地方。您可以将项目构建目录复制到定义的清单前缀文件夹中

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-dependency-plugin</artifactId>
   <version>2.5.1</version>
   <executions>
     <execution>
       <id>copy-dependencies</id>
       <phase>package</phase>
       <goals>
         <goal>copy-dependencies</goal>
       </goals>
       <configuration>
          <outputDirectory>
                      ${project.build.directory}/dependency-jars/
                </outputDirectory>
       </configuration>
     </execution>
   </executions>
</plugin>

所有依赖都在{project}/target/dependency-jars/

这种方法不包含任何依赖项到 jar 中,所有将在您定义的某个地方的 jar 中。

您可以根据需要使用这种方法配置您的项目

使用这种方法,您只需执行 mvn clean install 并执行您的 jar

我希望这种方法是您需要的解决方案。

【讨论】:

  • 感谢您的努力!我仍然觉得我对我需要什么还不够清楚。我不想把依赖罐放在某个地方。我想使用 maven 已经处理好的存储库。
  • 该死,我想换行并已经发布了评论:) 所以剩下的就是:理论上,我已经在我想要的本地 maven 存储库中拥有所有我需要的库能够下载任何其他maven项目,可能正在使用我已经安装在本地存储库中的一些库,也使用“maven install”安装它,然后删除我下载的源代码,然后执行由maven创建的.jar并告诉 java 或 maven(取决于最佳方法)在我的本地 maven 存储库中查找该项目的依赖项。
猜你喜欢
  • 2010-12-16
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 2016-06-04
  • 2014-06-08
  • 2023-03-30
相关资源
最近更新 更多