【问题标题】:Executablejar in jar using maven Shade plugin使用 maven Shade 插件的 jar 中的 Executablejar
【发布时间】:2017-07-31 11:41:35
【问题描述】:

我是 Java 世界的新手。我使用了依赖项 Math.jar 和 Special.jar,并编写了一个 Main 方法。这些 Math.jar 和 Special.jar 是从终端创建的,因此它们没有版本号。在构建项目时,它显示错误,即找不到依赖项的版本号。那么我的 pom.xml 应该包含什么。此外,如果有任何分步教程可以在 jar 中创建 jar 并使其可执行,那将会有很大帮助。此外,如果有任何不同的工具可用,请解释。先感谢您。这是它显示错误的部分,因为 jar 没有版本号,1.0 是我选择的随机数。我也在使用 Intellij idea / Eclipse / 终端。所以任何可以通过IDE或终端实现的解决方案都可以

'
<dependencies>
  <dependency>
    <groupId>Math</groupId>
    <artifactId>Math</artifactId>
    <version>1.0</version>
  </dependency>

  <dependency>
    <groupId>Special</groupId>
    <artifactId>Special</artifactId>
    <version>1.0</version>
  </dependency>

</dependencies>`

我需要的目录结构是

A.jar(包含以下文件) Math.jar Special.jar MainMethod.class META-INF

用户将只运行 A.jar,所有依赖项都将包含在 A.jar 中。

我剩下的 pom.xml 是

<build>
  <finalName>Workspace</finalName>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.5.1</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>2.3</version>
      <executions>
        <!-- Run shade goal on package phase -->
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <transformers>
              <!-- add Main-Class to manifest file -->
              <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>MainMethod</mainClass>
              </transformer>
            </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>2.3.2</version>
      <configuration>
        <archive>
          <manifest>
            <mainClass>MainMethod</mainClass>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>
</project>

【问题讨论】:

  • 我认为将您的问题分成两个单独的问题可能是有意义的:一个是关于如何依赖文件,一个是关于您在使用 maven-shade-plugin 时遇到的任何问题。

标签: java maven jar


【解决方案1】:

Maven 强烈主张应用程序的所有依赖项都应该在存储库中并从那里获取的理念。因此,对文件依赖的支持只是相当基本的。实际上,您有两个选择

系统依赖

像这样声明一个系统依赖:

<dependency>
  <groupId>Math</groupId>
  <artifactId>Math</artifactId>
  <scope>system</scope>
  <systemPath>path/to/math.jar</systemPath>
</dependency>

我认为这应该可以在不指定版本的情况下工作。请注意,Maven 人员已弃用系统依赖项。所以,这不是一个面向未来的解决方案。

安装依赖到本地仓库

另一种选择是使用以下命令将 jars 安装到本地 Maven 存储库中:

mvn org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file -Dfile=Math.jar -DgroupId=math -DartifactId=math -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true

这将在您的本地存储库中使用提供的坐标注册给定的 jar,以便您可以像在 pom 中一样引用它:

<dependency>
  <groupId>Math</groupId>
  <artifactId>Math</artifactId>
  <version>1.0</version>
</dependency>

更好的解决方案

我认为这两种解决方案更像是一种解决方法,而不是实际的解决方案。作为一个长期解决方案,我建议您也使用 Maven 构建依赖项。如果您想继续直接依赖文件,我建议切换到 ant 或 Gradle,因为这些构建工具将文件依赖视为一种合法的方式来声明依赖,而不是 Maven。

罐中罐

jar-in-jar 通常被称为 fat jar 或 uber-jar。对我来说,您对 maven-shade-plugin 的声明看起来不错。而且我认为它应该给你除了你的东西(我假设 mainMethod 是包含你的 public static void main(String[] args) 方法的类并且你没有任何包)。

【讨论】:

  • 伙计们感谢您的回复我试图实现一个jar插件但它有错误
  • 你能解释一下“实现一个 jar 插件”是什么意思吗?你的错误信息是什么?
  • 它基本上说的是 One jars repos 已更改,因此无法解决其在 pom.xml 中的依赖关系。该问题已解决的任何方法,我的项目运行良好。谢谢。
猜你喜欢
  • 2015-08-20
  • 2012-06-13
  • 2014-03-07
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 2023-03-15
  • 2015-03-23
  • 2015-02-05
相关资源
最近更新 更多