Spring Boot War 中缺少 json-simple.jar

Posted

技术标签:

【中文标题】Spring Boot War 中缺少 json-simple.jar【英文标题】:json-simple.jar is missing from spring boot war 【发布时间】:2016-06-02 18:42:03 【问题描述】:

打包的 WAR 中缺少 json-simple jar,因为它在 spring-boot-starter-parent 中标记为 optional,但我确实包含了一个依赖项 gelfj,它将 json-simple 声明为依赖项.....下面的示例(与 Maven 3.3.3 一起使用):

<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.giveandtake</groupId>
  <artifactId>main</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.2.RELEASE</version>
</parent>

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

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

  <dependencies>
    <dependency>
            <groupId>org.graylog2</groupId>
            <artifactId>gelfj</artifactId>
            <version>1.1.5</version>
        </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j</artifactId>
    <version>1.2.3.RELEASE</version>
</dependency>
  </dependencies>
</project>

[1] 使用 maven 3.0.4 打包战争时,我得到了 json-simple 内部战争(没有明确要求 jar)。

[2] 使用 maven 3.3.x war 打包时,我的 war(除非我明确要求)文件中没有这个 jar。

这给我留下了这些问题:

问题 1:如果我有 ProjectX-->(Inherit)Spring-boot-Parent 并且还声明了一个依赖于 json-simple 的依赖项 Y,那么 simple-json 的依赖项不应该是过渡到战争并认识到这不再是可选的?

问题2:为什么不同的maven版本会出现不同的结果【maven bug? ,搜索了发行说明,但没有找到任何匹配的内容]

【问题讨论】:

Spring Boot中这个问题的详细信息:***.com/q/38555184/466738和github.com/spring-projects/spring-boot/issues/6450。将在 Spring Boot 1.3.7 中修复 【参考方案1】:

如果我有 ProjectX-->(Inherit)Spring-boot-Parent 并且还声明了一个依赖于 json-simple 的依赖项 Y,那么 simple-json 的依赖项不应该传递到 war 并认识到它不再是可选的?

spring-boot-starter-parent pom 在其dependencyManagement 部分(而不是在其dependencies 部分)中将json-simple 依赖声明为optional

<dependencyManagement>
    <dependencies>
        ...
         <dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.1.1</version>
            <optional>true</optional>
         </dependency>
         ...

dependencyManagement 对声明的依赖项和传递依赖项具有强大的治理能力,在这种情况下,json-simple 对于声明的依赖项的任何传递依赖项(因此重新定义其中介),这就是为什么它不会被添加到打包的 war 中(即使 gelfj 依赖项将其作为传递依赖项)。

来自official documentation:

依赖管理部分的第二个也是非常重要的用途是控制传递依赖中使用的工件的版本 [...] 依赖管理优先于传递依赖的依赖中介。


为什么不同的maven版本会有不同的结果【maven bug? ,搜索了发行说明,但没有找到任何匹配的内容]

Maven 3.0.4 有一个default binding 到 Maven War 插件版本 2.1.1,而 Maven 3.3.3 有一个 default binding 到 Maven 战争插件版本 2.2,这是两个 Maven 版本和 War 插件的主要区别。

但是,spring-boot-starter-parent pom 在其pluginManagement 中将 WAR 插件声明为版本 2.5,因此会影响您最终将作为构建的一部分使用的版本,并消除上述两者之间的差异两个 Maven 版本。

所以这是一个 Maven 核心错误而不是 WAR 插件错误,this bug 看起来几乎是修复(在 Maven 版本 3.1.0 中)。

在我的测试中,我能够重现以下场景:

Maven 3.0.4,没有声明gelfj 依赖,因此json-simple 作为可选继承,WAR 插件没有打包它:正确的行为 Maven 3.3.3,未声明 gelfj 依赖项,再次将 json-simple 作为可选,未打包:正确行为 Maven 3.0.4gelfj 依赖声明,json-simple 仍应为可选,WAR 插件确实将其打包:不正确的行为 Maven 3.3.3gelfj 依赖声明,再次json-simple 仍然是可选的,WAR 插件没有打包它:正确的行为

因此,我建议您升级您的 maven 版本(推荐,避免 3.0.4)或明确声明该依赖项不是可选的(例如,通过将其声明为您的依赖项,或不在dependencyManagement 部分中是可选的)。

【讨论】:

【参考方案2】:

如果您有 json-simple 的依赖项管理条​​目,且 optional=true 在您的父母中,这可能会导致所描述的情况。 看看 eclipse 中的有效 pom 或者mvn help effective-pom 而不是搜索任何出现的 json-simple 可能会有所帮助。

对于版本差异:您也可以为此使用有效的 pom

【讨论】:

以上是关于Spring Boot War 中缺少 json-simple.jar的主要内容,如果未能解决你的问题,请参考以下文章

json响应spring boot中缺少字段

由于缺少 WebApp 库,在 Spring-boot-starter 项目中构建失败

缺少 JSON 密钥(在带有 kotlin 的 Spring-boot 上使用 @JsonComponent)

Spring Boot REST API war 文件生成 404 错误

带有 Spring Boot REST 控制器和 JSON 的空字段

spring boot --部署war到tomcat中