Создание проекта WAR с распаковкой JAR-зависимостей?

У меня есть два проекта: my-lib и my-webapp. Первый проект - это зависимость от my-webapp. Таким образом, при запросе Maven2 на создание моей WAR, my-lib JAR добавляется в каталог WEB-INF/lib/ веб-приложения.

Однако я хочу, чтобы my-lib JAR распаковывался непосредственно в каталог WEB-INF/classes, точно так же, как если бы my-lib источники содержались в проекте my-webapp.

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

my-webapp/
  ...
  WEB-INF/
    lib/
      my-lib-1.0.jar
      ... (others third libraries)

Я хочу иметь это:

my-webapp/
  ...
  WEB-INF/
    classes/
      my-lib files
    lib/
      ... (others third libraries)

Есть ли способ настроить плагин my-webapp или Maven2 для этого?

Ответ 1

Как говорит blaufish ответ, вы можете использовать maven-dependency-plugin распаковать mojo, чтобы распаковать артефакт. Однако, чтобы избежать появления баннера в WEB-INF/lib, вам не нужно указывать его как зависимость, а вместо этого настроить плагин на распаковать определенные артефакты.

Следующая конфигурация распакует содержимое some.group.id:my-lib:1.0:jar в target/classes во время фазы ресурсов процесса, даже если артефакт не определен как зависимость. Будьте осторожны при этом, хотя, поскольку есть потенциал для сглаживания вашего фактического контента, это может вызвать много отладки.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <id>unpack-my-lib</id>
      <phase>process-resources</phase>
      <goals>
        <goal>unpack</goal>
      </goals>
      <configuration>
        <artifactItems>
          <artifactItem>
            <groupId>some.group.id</groupId>
            <artifactId>my-lib</artifactId>
            <version>1.0</version>
            <type>jar</type>
            <overWrite>false</overWrite>
          </artifactItem>
        </artifactItems>
        <outputDirectory>${project.build.outputDirectory}</outputDirectory>
        <overWriteReleases>false</overWriteReleases>
      </configuration>
    </execution>
  </executions>
</plugin>

Ответ 2

Вы можете настроить плагин maven-dependency, чтобы просто сделать это, распаковать, а не копировать банку, как описано здесь.

<project>
[...]
<build>
 <plugins>
   <plugin>
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-dependency-plugin</artifactId>
     <version>2.5.1</version>
     <executions>
       <execution>
         <id>unpack</id>
         <phase>package</phase>
         <goals>
           <goal>unpack</goal>
         </goals>
         <configuration>
           <artifactItems>
             <artifactItem>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>3.8.1</version>
               <type>jar</type>
               <overWrite>false</overWrite>
               <outputDirectory>${project.build.directory}/alternateLocation</outputDirectory>
               <destFileName>optional-new-name.jar</destFileName>
               <includes>**/*.class,**/*.xml</includes>
               <excludes>**/*test.class</excludes>
             </artifactItem>
           </artifactItems>
           <includes>**/*.java</includes>
           <excludes>**/*.properties</excludes>
                 <outputDirectory>${project.build.directory}/wars</outputDirectory>
           <overWriteReleases>false</overWriteReleases>
           <overWriteSnapshots>true</overWriteSnapshots>
         </configuration>
       </execution>
     </executions>
   </plugin>
 </plugins>
</build>
[...]
</project>

Ответ 3

unpack mojo кажется близким к тому, к чему вы стремитесь. Не знаете, как завершить весь поток, который вы предлагаете.

(Кстати, я сомневаюсь, что это хорошая идея, классы полезности должны входить в банки, а банки помещаются либо в WAR, либо в EAR. Распаковка ящиков утилиты кажется неправильной)

Ответ 4

[Ой, просто понял, что вы используете Maven. Я не удаляю этот ответ, потому что он может прийти на помощь некоторым пользователям Ant. Так что мне не нужно меня менять...]

Сколько раз я должен упомянуть, что задачи Jar, War и Ear Ant являются подзадачами Zip один?:-) Если я правильно помню, что-то вроде этого будет делать трюк:

<war dist="my-webapp.war">
    <zipgroupfileset dir="libs" includes="*.jar" prefix="WEB-INF/classes"/>
</war>

Также стоит попробовать с src="mylib.jar", но я не тестировал эту опцию.

Ответ 5

Я смог использовать распакованный mojo, как описано выше, плюс я сам обозначил зависимость как "provided" (scope), чтобы избежать дублирования содержимое контейнера в WEB-INF/lib.