java - 将我的依赖项放入我的 JAR 中

标签 java maven maven-shade-plugin

我可以打包我写的JAVA项目。一种使用 Gson 库来实现 JSON 功能。我对 JAVA 很陌生,所以我可能会犯一个愚蠢的错误,但这是我的假设:

在我的源代码中:

import com.google.gson.Gson;

然后像这样使用这个导入:

Gson gson = new Gson();
String json = gson.toJson(result);

在我的 Maven pom.xml 中,我在依赖项部分包含了以下内容:

<dependencies>
  <dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-lambda-java-core</artifactId>
    <version>1.0.0</version>
  </dependency>
  <dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.2</version>
    <scope>compile</scope>
  </dependency>
</dependencies>

正如我所说,它确实毫无错误地打包到 JAR 文件(使用 Maven 进行打包),但我的 JAR 文件在 AWS 上用作无服务器功能,所以我相信我需要什么要做的就是将 Gson 依赖项包含在我的 JAR 文件中(可能是错误的)。这似乎得到了我在 AWS 上遇到的错误的支持:

aws error

在进行了一些谷歌搜索后,看起来 Maven 的“shade”插件可能就是答案。我将其添加到我的 pom.xml 中,如下所示:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.1.0</version>
    <configuration>
        <artifactSet>
            <includes>
              <include>com/google/gson/**</include>
            </includes>
        </artifactSet>
      </configuration>
      <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
          </execution>
       </executions>
 </plugin>

但是查看生成的 JAR 文件,我发现没有任何区别。我需要做什么才能让它发挥作用?


完整的 POM 文件可以在这里找到:pom.xml

最佳答案

我不熟悉shade其他人引用过的插件。在我看来,您需要一个可执行 jar 的 Artifact :一个 jar,及其依赖项

以下是我使用 Maven 执行此操作的方法:

<?xml version="1.0" encoding="UTF-8"?>
<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>com.company.groupId</groupId>
    <artifactId>artifact-id</artifactId>
    <version>1.0.0</version>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>

                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.1.0</version>

                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.company.App</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <version>3.0.0</version>
                <executions>
                    <execution>
                        <id>attach-javadoc</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>3.0.1</version>
                <executions>
                    <execution>
                        <id>attach-source</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-core</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.2</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>

你要注意的是构建插件,maven-assembly-plugin 。这告诉 Maven 如何组装/打包构建结果。在其配置中,您定义包含可运行应用程序的主类,该应用程序通常位于您的 public static void main(String[] args) 的位置。声明是。您还定义了一个描述符引用,它是一个将附加到 jar 名称的字符串。所以,你最终会得到 artifactId-1.0.0-jar-with-dependencies.jar ,以我的 POM 为例。

为了进一步解释发生了什么,如果没有我建议的更改,您的 POM 会告诉 Maven 只构建您的代码。作为其中的一部分,您声明依赖项,其中您现在有两个:aws-lambda-java-coregson 。当您不提供范围时,它默认为 compile范围。这告诉 Maven 在编译程序时获取该依赖项,以便程序可以使用该依赖项的代码。但是,当打包程序的构建 Artifact 时,Maven 默认情况下不会在最终的 jar 中包含这些依赖项;它期望当您运行该 jar 时,您的类路径上将具有这些依赖项。

通过添加程序集构建插件,您可以将这些指令更改为 Maven。使用该插件,您可以告诉 Maven,当它构建程序时,它需要以这样的方式组装它:所有声明的依赖项都包含在程序中(读作:组装),并在程序的打包阶段执行此操作。 build ;您将在 lib 中看到这些依赖项构建 Artifact 的文件夹。然后,就像我之前提到的,descriptorRef 是描述性信息,它将附加到构建 Artifact 的名称上。

顺便说一句,与您的问题并不真正相关,我建议您查看 FasterXML用于 JSON 处理和操作。功能更加强大,更加简单,并且得到了广泛的支持和使用,这意味着它背后有一个伟大的社区。

关于java - 将我的依赖项放入我的 JAR 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49056436/

相关文章:

java - 如何将图像存储在文件缓存中并加载以供以后在程序中使用

java - 无法弄清楚为什么数组显示为空

java - Jetty Plugin 9启动不喜欢icu4j-2.6.1.jar

java - 为什么 jboss 服务无法启动以及为什么我的休息时出现 404 错误?

java - maven-shade-插件 : how add all dependencies and custom local jar to executable jar?

maven - 创建着色 jar : Error in ASM processing class kotlin/collections/ArraysKt___ArraysKt. 类时出错:UTF8 字符串太大

java - 使用 Java 从图像文件中提取元数据

java - 如何将Spring Integration应用程序转换为Annotation?

java - Maven+Spring+Hibernate : java. lang.ClassNotFoundException : org. springframework.context.support.ClassPathXmlApplicationContext

java - 我如何在我的 JAR 中 bundle JRE,以便它可以在没有 Java 的系统上运行?