Maven提供了作用域,但spring启动程序webflux依赖项包含在已编译的jar中。为什么?

Maven提供了作用域,但spring启动程序webflux依赖项包含在已编译的jar中。为什么?,maven,spring-boot,spring-webflux,Maven,Spring Boot,Spring Webflux,我想构建jar文件库,不包括依赖项,因为它们将位于使用该库的应用程序的类路径中。为此,我使用了maven范围提供的,并且排除了所有依赖项,但只剩下很少的依赖项。我发现它们来自spring boot starter webflux。为什么会这样?我该怎么做才能摆脱它们呢 这里是依赖关系示例 <dependencies> <!-- Nevertheless provided scope some jars from this dependency are in c

我想构建jar文件库,不包括依赖项,因为它们将位于使用该库的应用程序的类路径中。为此,我使用了maven范围提供的,并且排除了所有依赖项,但只剩下很少的依赖项。我发现它们来自spring boot starter webflux。为什么会这样?我该怎么做才能摆脱它们呢

这里是依赖关系示例

<dependencies>
    <!-- Nevertheless provided scope some jars from this dependency
     are in compiled jar file. Why ? -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
        <scope>provided</scope>
    </dependency>
</dependencies>
例如,我看到一个POM文件

  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-reactor-netty</artifactId>
  <version>2.1.3.RELEASE</version>
  ...
  <dependencies>
    <dependency>
      <groupId>io.projectreactor.netty</groupId>
      <artifactId>reactor-netty</artifactId>
      <version>0.8.5.RELEASE</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
org.springframework.boot
弹簧起动器
2.1.3.1发布
...
伊奥·内蒂
反应堆网
0.8.5.1发布
编译
现在我仍然不明白为什么其他Spring Boot包含的库没有覆盖范围编译。这是否意味着这两个库构建错误,或者它们以这种方式构建是出于某种原因?我仍然不清楚如何以简单的方式删除似乎覆盖范围的依赖项

我试图将版本号放在POM依赖项中,但没有效果,编译的项目jar中包含相同的jar:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    <version>2.1.3.RELEASE</version>
    <scope>provided</scope>
</dependency>

org.springframework.boot
弹簧启动器webflux
2.1.3.1发布
假如
关于家长的更新

父pom文件spring boot starter父级不包含任何dependencyManagement节,但还有一个父级-spring boot dependencies,并且它确实有dependencyManagement节,但未提供在其中编译的范围。但有些依赖项具有范围导入。我不明白这个导入范围的依赖项在我的情况下是否会起作用。这里的一些样本:

<dependencyManagement>
    <dependencies>
        ...
        <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-reactor-netty</artifactId>
           <version>2.1.3.RELEASE</version>
       </dependency>
       ...
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-bom</artifactId>
            <version>${reactor-bom.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
       ...
    </dependencies>
</dependencyManagement>

...
org.springframework.boot
弹簧起动器
2.1.3.1发布
...
离子交换反应器
反应器物料清单
${reactor bom.version}
聚甲醛
进口
...
spring boot starter reactor netty的部分内容我在以前的更新中发布在这里

更新Andy Wilkinson之后回答只是为了澄清-这样的依赖项不包括在jar中,似乎spring boot maven插件在这里以不同的方式工作:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <scope>provided</scope>
</dependency>

org.springframework.boot
弹簧靴起动器
假如
org.springframework.boot
SpringBootStarterWeb
假如

父pom可能有一个覆盖作用域/版本的
dependencyManagement
部分。

Spring Boot fat jar旨在包含运行应用程序所需的所有内容。在启动JVM时,不能同时使用
-jar
-classpath
,这意味着jar需要包含提供的依赖项,并且它们没有其他方法进入类路径

for Spring Boot的Maven插件中描述了这种行为,其中说明如下:

上面的示例重新打包了在Maven生命周期的打包阶段构建的jar或war,包括在项目中定义的任何提供的依赖项

如果您不希望应用程序的jar中包含任何依赖项,即希望它是一个普通的jar而不是一个胖jar,那么您可能不希望使用springboot的Maven插件来构建它。如果从示例项目的
pom.xml
文件中删除它,然后构建它,则生成的jar包含以下内容:

$ unzip -l target/MavenProvidedTest-0.0.1-SNAPSHOT.jar 
Archive:  target/MavenProvidedTest-0.0.1-SNAPSHOT.jar
  Length      Date    Time    Name
---------  ---------- -----   ----
      329  02-22-2019 11:33   META-INF/MANIFEST.MF
        0  02-22-2019 11:33   META-INF/
        0  02-22-2019 11:33   META-INF/maven/
        0  02-22-2019 11:33   META-INF/maven/io.spring/
        0  02-22-2019 11:33   META-INF/maven/io.spring/MavenProvidedTest/
        1  02-22-2019 11:33   application.properties
     1403  02-22-2019 11:33   META-INF/maven/io.spring/MavenProvidedTest/pom.xml
      101  02-22-2019 11:33   META-INF/maven/io.spring/MavenProvidedTest/pom.properties
---------                     -------
     1834                     8 files

如果您希望包含一些但不是所有的依赖项,那么您可以继续使用Spring Boot的Maven插件和一些依赖项。

从您的问题中,我了解到您需要一个精简的可执行jar。因为你可以使用插件。它将排除要打包为jar一部分的依赖项,但将在第一次运行期间从maven下载,或者您可以提供自己的本地repo,在那里可以找到所有jar文件


有关详细信息,请参阅此

Hello。谢谢你的主意。我试图检查pom文件的依赖关系,并更新了我的问题。我仍然不清楚为什么仅仅在少数库中覆盖了作用域,以及如何处理它。坦率地说,我不理解您(在您的编辑中)尝试了什么。我的建议是:转到SpringBootStarter家长,也就是您的家长,看看它是否有
部分。看看它是否设置了一些意外地“编译”而不是“提供”的依赖项。您好。是的,我可能做了一些奇怪的事情,因为我不明白这一切。父级没有这样的节,但它还有一个父级,在那里编译的作用域根本没有使用。但有些依赖项具有范围导入。没有范围的依赖项具有隐式范围编译。Scope import从定义的文件导入一个列表(因此在那里查找依赖项)。不幸的是,我无法理解这是如何工作的,因此放弃了。谢谢你的努力。文档链接是针对2.1.3.RELEASE的,而我使用1.5.6.RELEASE模块。我仍然使用Java8,并且习惯用这种方式使用库JAR。此模块布局不在2.x版本中(请记住,我们曾与您讨论过文档更新)。布局模块的意思不是可运行的jar,而是库。所以我根本不需要java-jar。无论如何,我会尝试你的想法删除SpringBootMaven插件。如果你需要模块布局,你应该在任何地方使用SpringBoot1.5,而不是使用SpringBoot2.1,只降级Maven插件。为了记录在案,1.5文档还描述了提供的
依赖项的行为。这意味着Spring Boot Maven插件1.x与Spring Boot 2.x不兼容。这对我来说是新的-可能我错过了什么。我在SpringBoot2.x上工作了一段时间,但没有找到用Spring构建jar库的方法
$ unzip -l target/MavenProvidedTest-0.0.1-SNAPSHOT.jar 
Archive:  target/MavenProvidedTest-0.0.1-SNAPSHOT.jar
  Length      Date    Time    Name
---------  ---------- -----   ----
      329  02-22-2019 11:33   META-INF/MANIFEST.MF
        0  02-22-2019 11:33   META-INF/
        0  02-22-2019 11:33   META-INF/maven/
        0  02-22-2019 11:33   META-INF/maven/io.spring/
        0  02-22-2019 11:33   META-INF/maven/io.spring/MavenProvidedTest/
        1  02-22-2019 11:33   application.properties
     1403  02-22-2019 11:33   META-INF/maven/io.spring/MavenProvidedTest/pom.xml
      101  02-22-2019 11:33   META-INF/maven/io.spring/MavenProvidedTest/pom.properties
---------                     -------
     1834                     8 files