Область действия Maven - предоставляется, но в скомпилированный jar включены зависимости spring-boot-starter-webflux.Зачем? - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу собрать библиотеку файлов jar и не включать зависимости, так как они будут в пути к классу приложения, которое будет использовать эту библиотеку.Я использую maven scope - при условии для этого все зависимости исключены, но немногие еще остались.Я обнаружил, что они пришли из 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>

Пример проекта только с одной этой зависимостью https://github.com/pavelmorozov/MavenProvidedTest/blob/master/pom.xml

Пусто скомпилированоjar проекта имеет размер 5+ мегабайт.

Обновление После предложения JF Meier я попробовал mvn зависимость: дерево и нашел две библиотеки с областью действияcompile

[INFO]    +- org.springframework.boot:spring-boot-starter-reactor-netty:jar:2.1.3.RELEASE:provided
[INFO]    |  \- io.projectreactor.netty:reactor-netty:jar:0.8.5.RELEASE:compile
[INFO]    |     +- io.netty:netty-codec-http:jar:4.1.33.Final:compile
[INFO]    |     |  +- io.netty:netty-common:jar:4.1.33.Final:compile
[INFO]    |     |  +- io.netty:netty-buffer:jar:4.1.33.Final:compile
[INFO]    |     |  +- io.netty:netty-transport:jar:4.1.33.Final:compile
[INFO]    |     |  |  \- io.netty:netty-resolver:jar:4.1.33.Final:compile
[INFO]    |     |  \- io.netty:netty-codec:jar:4.1.33.Final:compile
[INFO]    |     +- io.netty:netty-codec-http2:jar:4.1.33.Final:compile
[INFO]    |     +- io.netty:netty-handler:jar:4.1.33.Final:compile
[INFO]    |     +- io.netty:netty-handler-proxy:jar:4.1.33.Final:compile
[INFO]    |     |  \- io.netty:netty-codec-socks:jar:4.1.33.Final:compile
[INFO]    |     \- io.netty:netty-transport-native-epoll:jar:linux-x86_64:4.1.33.Final:compile
[INFO]    |        \- io.netty:netty-transport-native-unix-common:jar:4.1.33.Final:compile
...
[INFO]    +- org.springframework:spring-webflux:jar:5.1.5.RELEASE:provided
[INFO]    |  \- io.projectreactor:reactor-core:jar:3.2.6.RELEASE:compile
[INFO]    |     \- org.reactivestreams:reactive-streams:jar:1.0.2:compile

И, например, я вижу один из файлов 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>

Теперь я до сих пор не понимаю, почему другие библиотеки Spring Boot не переопределяют scope to компилировать .Означает ли это, что две библиотеки построены неправильно или по какой-то причине?И я до сих пор не понимаю, как простым способом удалить зависимости, которые, кажется, имеют область переопределения?

Я пытался указать номер версии в своей зависимости 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>

Обновление о родителях

Родительский pom-файл spring-boot-starter-parent не содержит 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>

Часть содержимого spring-boot-starter-реактор-netty я выложил здесь в предыдущем обновлении.

Обновление после Энди Уилкинсон ответьте просто для пояснения - такие зависимости не включены в jar, похоже, что плагин весенней загрузки 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>

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Жирная банка Spring Boot предназначена для хранения всего, что требуется для запуска приложения.Вы не можете использовать -jar и -classpath одновременно при запуске JVM, так что это означает, что jar должен содержать предоставленные зависимости, а также что у них нет другого способа попасть на путь к классам.

Это поведение описано в документации для плагина Maven для Spring Boot, где говорится следующее:

В приведенном выше примере перепаковывается jar или war, которые были собраны во время пакетафаза жизненного цикла Maven, включая все предоставленные зависимости, определенные в проекте.

Если вы не хотите, чтобы в jar-файле приложения были упакованы зависимости, то есть вы хотите, чтобы он былобычная банка, а не толстая, тогда вы, вероятно, не хотите использовать плагин Spring Boot 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 и исключить некоторые зависимости.

0 голосов
/ 07 мая 2019

Из вашего вопроса я понимаю, что вам нужна тонкая исполняемая банка.Для вас может быть использован плагин spring-thin-launcher .Это исключит зависимости, которые будут упакованы как часть jar, но будет загружаться из maven при первом запуске, или вы можете предоставить свое локальное хранилище, где можно найти все файлы jar.

Подробнее см. В этом учебник

0 голосов
/ 21 февраля 2019

Возможно, что родительский pom имеет секцию dependencyManagement, которая перезаписывает области / версии.

...