【问题标题】:How to create a fat jar?如何制作一个胖罐子?
【发布时间】:2017-05-20 07:23:09
【问题描述】:

使用 SpringBoot,您有 @SpringBootApplication 注释,但与整洁的 Java Spark 框架等效的是什么?

IntelliJ 创建了一个 Maven 项目并添加了 spark 依赖项,但运行安装目标时,我得到了一个 5 KB 的 jar,没有清单。不是可执行的 jar。

目前创建的pom.xml如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>sparkdemo</groupId>
  <artifactId>sparkdemo</artifactId>
  <version>1.0 </version>
  <packaging>jar</packaging>

  <name>sparkdemo</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.sparkjava</groupId>
      <artifactId>spark-core</artifactId>
      <version>2.5.4</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <source>${java.version}</source>
          <target>${java.version}</target>
          <optimize>true</optimize>
          <debug>true</debug>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

不胜感激任何建议....谢谢!

【问题讨论】:

  • 我对 spark 不是很熟悉,但是既然你有 maven 并且这是一个 pom,这听起来像是 Maven shade plugin 的工作。
  • maven 程序集插件会有所帮助,但如果你有源代码,你总是可以将它作为 maven 任务执行,maven 会处理依赖关系

标签: java maven jar spark-java


【解决方案1】:

您需要的是一个可执行的 jar,它不仅包含您的类,还包含所有依赖项中的类。 为此,您可以使用Maven Assembly Plugin

请参阅下面的示例代码。

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.0.0</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass>org.sample.App</mainClass>     // specify your main class here
            </manifest>
          </archive>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- bind to the packaging phase -->
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      [...]
</project>

然后,运行mvn package,可执行jar应该位于文件夹target(名称类似于ProjectName-1.0-SNAPSHOT-jar-with-dependencies.jar)中。

【讨论】:

  • 这很好用!谢谢!!!我只是使用了错误的 Maven Intellij 设置吗?我认为 Maven 会处理这些东西,所以我一定是使用太基本的 Maven 设置创建了项目?
  • 默认情况下,maven在构建和打包应用时不会打包任何依赖的jar。 Maven 更多地是为 J2EE 目的而设计的。如果您的应用程序包含一个主类并且您想要执行它(您生成的 jar),那么您将需要所有依赖项也存在于您的类路径中(应用程序具有主类)。这不是 Maven 提供的默认行为。因此,您必须明确告诉 maven 构建一个可执行 jar,其中所有依赖项也与您的应用程序 jar 一起打包。
【解决方案2】:

看起来您正在寻找 maven 程序集插件

在插件部分添加这个并运行mvn package

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.0.0</version>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
    <executions>
        <execution>
            <id>assemble-all</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

【讨论】:

    猜你喜欢
    • 2016-12-29
    • 2017-07-25
    • 1970-01-01
    • 2021-08-10
    • 2013-04-19
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多