Почему зависимости Maven моего JAR-файла не включены в мою WAR? - PullRequest
0 голосов
/ 01 февраля 2020

У меня есть 2 проекта Eclipse: (1) my-library, который строит my-library-1.0.jar; и (2) my-deployable, который строит my-deployable-1.0.war.

my-library - это зависимость, указанная в pom.xml из my-deployable.
my-library имеет 2 зависимости (2 Apache JAR-файл commons), указанный в его pom.xml.

my-library, зарегистрирован на моем Nexus, и я могу получить его.

Когда я строю my-deployable-1.0.war, используя цели clean compile package, my-library-1.0.jar включается в папку WEB-INF\lib, но его 2 зависимости не включаются в WAR, где они ожидаются. У меня сложилось впечатление, что мне не нужно указывать их явно в pom.xml из my-deployable, потому что они уже перечислены в pom.xml из my-library.

Почему нет зависимости для my-library JAR, включенного в my-deployable WAR при сборке?

pom.xml для my-library читает:

<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.my</groupId>
  <artifactId>my-library</artifactId>
  <version>1.0</version>
  <name>My Library</name>
  <description>This is my library JAR. It will be included in my WAR.</description>
  <dependencies>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.5</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-compress</artifactId>
      <version>1.17</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
  <build>
    <testResources>
      <testResource>
        <directory>src/test/resources</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </testResource>
      <testResource>
        <directory>src/test/java</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </testResource>
    </testResources>
  </build>
</project>

pom.xml для my-deployable читает:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.12.RELEASE</version>
        <relativePath/>
    </parent>
    <groupId>com.my</groupId>
    <artifactId>my-deployable</artifactId>
    <version>1.0</version>
    <packaging>war</packaging>
    <name>My Deployable</name>
    <description>A deployable WAR for Spring Boot that has a dependency of my-library</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.my</groupId>
            <artifactId>my-library</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Ответы [ 3 ]

1 голос
/ 02 февраля 2020

Я создал 2 скелетных проекта с вашими помпами выше. Pom "my-deployable" не создается, так как в Spring-boot-maven-plugin отсутствует определение mainClass

Ошибка:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 14.718 s
[INFO] Finished at: 2020-02-01T22:31:35+00:00
[INFO] Final Memory: 28M/120M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.1.12.RELEASE:repackage (repackage) on project my-deployable: Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.1.12.RELEASE:repackage failed: Unable to find main class -> [Help 1]

Если я добавлю следующий раздел, указывающий на класс с пустым методом main, я могу скомпилировать и упаковать проект

<configuration>
    <mainClass>com.my.MainClass</mainClass>
</configuration>

Полученный файл war действительно содержит зависимости my-library. Либо вы удалили какой-то ключ, когда анонимно указали pom, либо пропустили ошибку сборки?

enter image description here

1 голос
/ 01 февраля 2020

Ваш подход правильный. Они предназначены для участия в войне.

Ваши зависимости и их границы также выглядят правильно.

Я бы проверил журнал Maven на [WARNING] с и [ERROR] с. Возможно, у вас проблема с POM отсутствует или недействительна.

0 голосов
/ 04 февраля 2020

Когда JAR был зарегистрирован во внутреннем репозитории Nexus (это задание передано вспомогательной команде), назначенный ему pom.xml был сгенерированным Nexus Sonatype pom.xml, а не включенным в JAR. Сгенерированный файл не имел связанных зависимостей.

Недопустимый сгенерированный pom.xml похож на:

<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.my</groupId>
<artifactId>my-library</artifactId>
<version>1.0</version>
<description>POM was created by Sonatype Nexus</description>
</project>

Я обнаружил это, проверив pom.xml для каждого JAR в Nexus, сравнивая его с одним и тем же в каждой папке .m2 и в каждом проекте; Я жестко поменял местами .m2 pom.xml с файлом из связанного проекта, построил мою WAR, и появились транзитивные зависимости.

Следующим шагом будет восстановление всех записей Nexus с правильными pom.xml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...