jar中的Executablejar使用maven Shade插件

时间:2017-07-31 11:41:36

标签: java maven jar

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

我的其余部分是

<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>

1 个答案:

答案 0 :(得分:-1)

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

系统依赖

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

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

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

将依赖项安装到本地存储库

另一个选择是使用以下命令将jar安装到本地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通常被称为胖罐或超级罐。对我来说,maven-shade-plugin的声明看起来还不错。而且我认为它应该给你你的东西(我假设mainMethod是包含你的public static void main(String[] args)方法的类,你没有任何包。)