Как добавить файл войны в другие зависимости Java-приложения?

У меня есть проект web maven. Вывод проекта - это файл war. Я хочу добавить этот файл war в зависимость от project_b.
Файл project_b pom.xml имеет плагин следующим образом:

...
<plugin>
    <inherited>true</inherited>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.3</version>
    <configuration>
        <warName>geoserver</warName>
        <webappDirectory>${project.build.directory}/geoserver</webappDirectory>
        <packagingExcludes>WEB-INF/lib/servlet-api*.jar</packagingExcludes>
        <archive>
            <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
            </manifest>
            <manifestEntries>
                <GeoServerModule>core</GeoServerModule>
                <Application-Name>${project.build.finalname}</Application-Name>
                <Project-Version>${project.version}</Project-Version>
                <Iteration-Name>${iteration}</Iteration-Name>
                <Build-Timestamp>${maven.build.timestamp}</Build-Timestamp>
                <Git-Revision>${build.commit.id}</Git-Revision>
            </manifestEntries>
        </archive>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>war</goal>
            </goals>
        </execution>
    </executions>
</plugin>
...

Как добавить war веб-приложения к project_b с помощью <groupId>org.itsme</groupId>, <artifactId>spring3-mvc-maven-xml-hello-world</artifactId>, <packaging>war</packaging> и <version>1.0-SNAPSHOT</version>?

Ответ 1

В Maven добавление зависимости - всего лишь кусок пирога. Взгляните на следующий 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/maven-v4_0_0.xsd"
>
    <modelVersion>4.0.0</modelVersion>

    <!-- Project Details -->
    <groupId>ykyuen</groupId>
    <artifactId>project-apple</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>
    <name>project-apple</name>

    <dependencies>
        <!-- project-apple depends on project-banana -->
        <dependency>
            <groupId>ykyuen</groupId>
            <artifactId>project-banana</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
</project>

Настройка указанной зависимости аналогична импортированию проекта-banana.jar в project-apple.

Теперь у меня есть другой проект веб-приложений Maven, называемый project-orange с типом упаковки, равным войне. Добавление вышеупомянутой ссылки зависимостей вообще не работает, поскольку Java не видит файл .war как путь к классам. Чтобы решить проблему, существует два подхода.

  • Создайте модуль Maven, который содержит классы project-orange с упаковкой jar. Теперь вы можете рассматривать новый модуль Maven как нормальную зависимость.

  • Настройте maven-war-plugin таким образом, чтобы он создавал файл .jar при создании файла .war. Добавьте следующий код в node вашего военного проекта. Ниже приведен пример.

.

...
<build>
    <plugins>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.1.1</version>
            <configuration>
                <attachClasses>true</attachClasses>
                <classesClassifier>classes</classesClassifier>
            </configuration>
        </plugin>
    </plugins>
</build>
...

После запуска mvn install вы можете найти следующие файлы архива в целевой папке

  • Проект-orange.war
  • Проект-оранжево-classes.jar

Теперь вы можете отредактировать pom.xml проекта-apple для добавления новой зависимости.

<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/maven-v4_0_0.xsd"
>
    <modelVersion>4.0.0</modelVersion>

    <!-- Project Details -->
    <groupId>ykyuen</groupId>
    <artifactId>project-apple</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>
    <name>project-apple</name>

    <dependencies>
        <!-- project-apple depends on project-banana -->
        <dependency>
            <groupId>ykyuen</groupId>
            <artifactId>project-banana</artifactId>
            <version>1.0</version>
        </dependency>
        <!-- project-apple depends on project-orange -->
        <dependency>
            <groupId>ykyuen</groupId>
            <artifactId>project-orange</artifactId>
            <version>1.0</version>
            <!-- To map the project-orange-classes.jar -->
            <classifier>classes</classifier>
        </dependency>
    </dependencies>
</project>

ссылка: http://eureka.ykyuen.info/2009/10/30/maven-dependency-on-jarwar-package/

Ответ 2

В последнее время я столкнулся с одной и той же проблемой. Вот как я решил это очень просто.

Шаг 1: В оригинальном проекте (не зависит от какого-либо проекта) Настройте плагин maven war таким образом, чтобы он создавал войну, а также банку. Банк будет загружен в репозиторий maven, когда мы выполним mvn clean install.

Моя первая часть pom выглядела так:

<modelVersion>4.0.0</modelVersion>
<groupId>com.pancharatna</groupId>
<artifactId>TestWebApp</artifactId>
**<packaging>jar</packaging>**
<version>1.0-SNAPSHOT</version>

Затем добавьте еще один плагин в раздел сборки:

<build>
    <finalName>TestWebApp</finalName>
    <plugins>
        **<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <executions>
                <execution>
                    <id>make-a-war</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>war</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>**

        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>

    </plugins>
</build>

Шаг 2: Во втором проекте (который зависит от первого проекта) поместите jar (Original Project) в pom.

   <dependency>
        <groupId>com.pancharatna</groupId>
        <artifactId>TestWebApp</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>

Шаг 3: Сделайте mvn чистой установкой для проекта, а затем для второго проекта

Шаг 4: Необязательно: вместо создания проектов последовательно и отдельно, как указано в шаге 3, мы можем создать родительский pom. Мы можем просто запустить mvn clean install.:

C:/Test/
        ├───Project1
        │   └───src/main/...
        │   └───pom.xml
        │
        ├───Project2
        │   └───src/main/...
        │   └───pom.xml
        │
        ├───pom.xml   <!-- parent pom -->

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.MyApp</groupId>
    <artifactId>myproject</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>myproject</name>
    <url>http://maven.apache.org</url>
    </dependencies>
    <modules>
        <module>/Project1</module>
        <module>/Project2</module>
    </modules>
</project>