Maven WAR Overlays — включая распакованные зависимости

Я пытаюсь настроить проект с помощью Maven и немного застрял в том, как включить некоторые сторонние зависимости, которые необходимо включить без упаковки в результирующий файл войны.

Мой проект содержит некоторый пользовательский код ColdFusion и включает в себя зависимости Java, в том числе ColdFusion, упакованный в виде файла войны. Затем я пытаюсь включить сторонний код ColdFusion, который я установил в свой репозиторий maven, упакованный в виде jar, но на самом деле я хочу развернуть его без упаковки в полученном файле войны. Это распаковка сторонних библиотек, с которой я застрял. Я бы очень хотел, чтобы это было сделано ДО создания войны, чтобы я мог использовать war:exploded во время разработки.

В настоящее время мой 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>
      <groupId>com.mycompany.app</groupId>
      <artifactId>my-webapp</artifactId>
      <packaging>war</packaging>
      <version>1.0-SNAPSHOT</version>
      <name>my-webapp Maven Webapp</name>
      <url>http://maven.apache.org</url>
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>

        <!-- This is the war overlay -->
        <dependency>
            <groupId>com.adobe.coldfusion</groupId>
            <artifactId>coldfusion</artifactId>
            <version>9.0.1</version>
            <type>war</type>
            <scope>runtime</scope>
            <optional>false</optional>
        </dependency>  

        <!-- This is the 3rd party ColdFusion dependency -->    
        <dependency>
            <groupId>org.corfield</groupId>
            <artifactId>fw1</artifactId>
            <version>1.2RC2A</version>
            <scope>provided</scope>
        </dependency>

     </dependencies>
     <build>
        <finalName>my-webapp</finalName>
     </build>
  </project>

У меня получилось сделать то, что я хочу, изменив раздел сборки следующим образом:

<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>unpack</id>
                    <phase>package</phase>
                    <goals>
                        <goal>unpack</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>org.corfield</groupId>
                                <artifactId>fw1</artifactId>
                                <version>1.2RC2A</version>
                                <type>jar</type>
                                <overWrite>true</overWrite>
                                <outputDirectory>${project.build.directory}/${project.artifactId}</outputDirectory>
                                <includes>**/*.cfc</includes>
                            </artifactItem>
                           </artifactItems>
                        <includes>**/*.cfc</includes>
                        <outputDirectory>${project.build.directory}/${project.artifactId}</outputDirectory>
                        <overWriteReleases>false</overWriteReleases>

                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Проблема в том, что package:unpack происходит после того, как война собрана, поэтому распакованные зависимости отсутствуют в результирующем файле войны.

Я также пробовал кое-что с плагином сборки, и я довольно близко подошёл к этому, используя что-то вроде этого:

<assembly>
    <id>${project.artifactId}</id>
    <formats>
        <format>war</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <includes>
                <include>org.corfield:fw1</include>
            </includes>
            <unpack>true</unpack>
            <outputDirectory>/</outputDirectory>
        </dependencySet>
        <dependencySet>
            <excludes>
                <exclude>org.corfield:fw1</exclude>
            </excludes>
            <unpack>false</unpack>
            <outputDirectory>/WEB-INF/lib</outputDirectory>
        </dependencySet>
    </dependencySets>
    <fileSets>
        <fileSet>
            <directory>src/main/webapp</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

Однако это создало второй военный файл с именем что-то вроде my-webapp-1.0-SNAPSHOT-my-webapp.war, а также my-webapp-1.0-SNAPSHOT.war. My-webapp-1.0-SNAPSHOT-my-webapp.war также включает my-webapp-1.0-SNAPSHOT.war

В конце концов, я хочу, чтобы моя результирующая война выглядела так:

org
 |-- corfield
    |-- framework.cfc
WEB-INF
 |-- lib
 |-- web.xml
index.cfm

(на самом деле это намного больше, но, надеюсь, этого достаточно, чтобы проиллюстрировать суть)

Я думаю, что я довольно близок, но мне просто не хватает чего-то, что мне нужно. Буду крайне признателен за любую помощь.


person Andrew Myers    schedule 04.11.2010    source источник


Ответы (2)


Для подхода maven-dependency-plugin привяжите цель unpack к фазе prepare-package (Maven 2.1+) вместо package.

использованная литература

person Pascal Thivent    schedule 04.11.2010
comment
@AndrewMyers: Пожалуйста. И на всякий случай загляните в этот блог (хотя я не тестировал это расширение m2eclipse). - person Pascal Thivent; 05.11.2010
comment
Я такого не видел - выглядит очень многообещающе. Я проверю это сейчас! Спасибо! - person Andrew Myers; 05.11.2010

Вы смотрели на параметр overlay с maven-war-plugin? По сути, это позволяет вам развернуть войну ColdFusion поверх макета вашего сайта. Я сделал это с помощью комбинации ColdFusion 9.x и Struts2. Выполнение оверлея только для ColdFusion должно сделать его очень простым. Вы можете сначала создать войну ColdFusion. Затем вы также можете управлять файлами neo-*.xml из своего проекта Maven.

person jgifford25    schedule 04.11.2010
comment
Похоже, вы делаете именно то, что делаю я (хотя я использую Spring, а не Struts). Я также использую опцию наложения войны. Спасибо за ваш ответ, но ответ Паскаля Тивента был тем, который я искал. Какую IDE вы используете из интереса? Я думаю, что соглашусь на Intellij, поскольку Eclipse не очень хорошо поддерживает Maven Overlays, а Netbeans не поддерживает CF... - person Andrew Myers; 05.11.2010
comment
Я использую командную строку большую часть времени. Вы уже обновили плагин m2eclipse до версии 0.10.x. Это намного лучше, чем версия 0.9.x. - person jgifford25; 05.11.2010
comment
Да, я пробовал m2eclipse 0.10.x, а также IAM (ранее известный как q4e). IAM должен делать оверлеи войны, но я не могу заставить его работать. m2eclipse не работает, и я не смог заставить работать расширение, на которое ссылается Pascal выше. Все очень грязно. - person Andrew Myers; 07.11.2010
comment
Какую версию Maven вы используете? 2.2.х? И какую версию плагина maven war вы указали? Похоже, вам нужно как минимум 2.1-альфа-1, указанное для плагина войны. - person jgifford25; 08.11.2010