gpt4 book ai didi

maven - spring boot war中缺少json-simple.jar

转载 作者:行者123 更新时间:2023-12-05 00:56:56 25 4
gpt4 key购买 nike

json-simple jar 在打包的 WAR 中丢失,因为它被标记为 optionalspring-boot-starter-parent , 但我确实包含了一个依赖项 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 打包 war 时,我得到了 json-simple inside war(没有明确要求 jar)。

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

这给我留下了以下问题:

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

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

最佳答案

if i have ProjectX-->(Inherit)Spring-boot-Parent and also declare a dependency Y that has dependency for json-simple, shouldnt the dependency for simple-json be transitive into war and recognize that as not optional anymore?


spring-boot-starter-parent pom 在其 json-simple 部分(而不是在其 optional 部分)中将 dependencyManagement 依赖声明为 dependencies:
<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 作为 optional 用于声明的依赖项的任何传递依赖项(因此重新定义其中介),这就是为什么它不会被添加到打包的 war 中(即使 gelfj 依赖项将其作为传递依赖项)。

来自 official documentation :

A second, and very important use of the dependency management section is to control the versions of artifacts used in transitive dependencies [...] dependency management takes precedence over dependency mediation for transitive dependencies.



why is the different results with different maven versions [maven bug? , searched for release notes but didnt find anything matching]



Maven 3.0.4 有一个 default binding 到 Maven War Plugin 版本 2.1.1 ,而 Maven 3.3.3 有一个 default binding 到 Maven War Plugin 版本 _0x1045679507 的两个主要版本,即 Maven War Plugin 版本 _0x1045679507 和 Maven War Plugin 两个版本的主要区别。

但是, 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 插件没有打包它:正确行为_0x1045679
  • Maven 3.3.3 ,未声明 gelfj 依赖项,再次将 json-simple 作为可选,未打包:正确行为
  • Maven 3.0.4 gelfj 依赖声明,json-simple 应该仍然是可选的,WAR 插件确实打包了它: INCORRECT_506070607060070000006
  • Maven 3.3.3 gelfj 依赖声明,json-simple 仍然是可选的,WAR Plugin 没有打包它:CORRECT BEHAVIOR _0x108456791

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

  • 关于maven - spring boot war中缺少json-simple.jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35535003/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com