如何创建一个“Fat Jar”?

3

使用SpringBoot,你可以使用@SpringBootApplication注解,但是在Java Spark框架中有什么等效的注解呢?

IntelliJ创建了一个Maven项目,我添加了Spark依赖项,但运行install目标时,我得到了一个没有清单的5KB 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>

希望能得到您的建议...谢谢!


1
我对Spark不是很熟悉,但既然你有Maven并且这是一个POM文件,那么这听起来像是Maven shade插件的工作。 - Compass
Maven Assembly插件会有所帮助,但如果您有源代码,您也可以将其作为Maven任务执行,Maven会处理依赖项。 - Kalpesh Soni
2个回答

9
你需要的是一个可执行的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设置创建了项目? - Morkus
1
默认情况下,当您构建和打包应用程序时,Maven 不会打包任何依赖的 JAR 包。Maven 更多地是为 J2EE 目的而设计的。如果您的应用程序包含一个主类,并且您想要执行它(生成的 JAR 文件),那么您需要所有的依赖项也存在于您的类路径上(具有主类的应用程序)。这不是 Maven 提供的默认行为。因此,您必须明确告诉 Maven 构建一个可执行的 JAR 文件,并将所有依赖项与您的应用程序 JAR 包一起打包。 - RITZ XAVI

1

看起来你正在寻找Maven Assembly插件

在插件部分添加以下内容,然后运行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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接