maven-war-plugin, как исключить предоставленный jar из каталога lib, но включить в манифест с префиксной папкой

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

Проблема, с которой я столкнулся, заключается в том, чтобы заставить файл manifest.mf войны указать, что предоставленные банки находятся в папке уха / libs, а банки компиляции / времени выполнения находятся в войне. т. е. запись пути к классу manifest.mf должна выглядеть следующим образом:

Class-Path: libs/commons-lang.jar commons-codec.jar

commons-lang имеет ограниченную область действия и ожидается, что он будет находиться в каталоге ear libs.

commons-codec находится на этапе компиляции и, как ожидается, станет частью войны.

Я изучил maven-war-plugin, но не могу понять, как заставить его предоставлять classpathPrefix только для предоставленных зависимостей.

Предложения, пожалуйста?


Окончательное принятое решение (спасибо всем за советы и ссылки). Требуется, чтобы зависимости, предоставленные ухом, были ограничены предоставленными, и это, заметил взлом: fake-application.xml:

 <plugin>
    <!--required to fix the war's manifest and skinny the war-->
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ear-plugin</artifactId>
    <version>2.10.1</version>
    <configuration>
        <defaultLibBundleDir>lib/</defaultLibBundleDir>
        <skinnyWars>true</skinnyWars>
        <generateApplicationXml>true</generateApplicationXml>
        <applicationXml>${project.basedir}/src/test/fake-ear/fake-application.xml</applicationXml>
    </configuration>
    <executions>
        <execution>
            <phase>verify</phase>
            <goals><goal>ear</goal></goals>
        </execution>
    </executions>
 </plugin>

Затем я развертываю эту новую тощую войну в репозиторий и делаю это с помощью плагина развертывания maven:

<plugin>
    <!--used in release build to deploy skinny war to nexus-->
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-deploy-plugin</artifactId>
    <version>2.8.2</version>
    <executions>
        <execution>
            <id>deploy-file</id>
            <phase>install</phase>
            <goals>
                <goal>deploy-file</goal>
            </goals>
            <configuration>
                <!--location of the skinny war after maven-ear-plugin builds it-->
                <file>${project.build.directory}/${project.artifactId}-${project.version}/${artifactid}-${project.parent.version}.war</file>
                <repositoryId>releases</repositoryId>
                <url>${distributionManagement.repository.url}</url>
                <groupId>${project.parent.groupId}</groupId>
                <artifactId>${artifactid}</artifactId>
                <version>${project.parent.version}</version>
                <packaging>war</packaging>
            </configuration>
        </execution>
    </executions>
</plugin>

person alfan    schedule 09.11.2016    source источник
comment
Вы хотите посмотреть на плагин Maven EAR, так как хотите создать EAR. Он поддерживает скини-войны и правильно переписывает манифест каждой войны maven.apache.org/plugins/maven-ear-plugin/examples/   -  person Tunaki    schedule 09.11.2016
comment
Но в противном случае вам нужно передать <addClasspath>true</addClasspath>, чтобы ваша конфигурация <classpathPrefix> работала, см. связанный вопрос.   -  person Tunaki    schedule 09.11.2016


Ответы (1)


Предложение @Tunaki maven-ear-plugin кажется более целостным, но в любом случае взгляните: https://maven.apache.org/plugins/maven-shade-plugin/examples/executable-jar.html

Вы можете изменить манифест следующим образом:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.4.3</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <manifestEntries>
                    <Class-Path>libs/commons-lang.jar commons-codec.jar</Class-Path>
                  </manifestEntries>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>
person nandsito    schedule 09.11.2016
comment
Это не целостный метод, это единственный способ, который действительно работает. У этого много побочных эффектов: работает только для 1 WAR, упаковывает все классы в корневую директорию WAR, нужно самому писать каждую зависимость... Все это, наверное, не нужно. - person Tunaki; 09.11.2016
comment
@Tunaki Я действительно упомянул ваше предложение как лучшее в целом. У меня просто локальное исправление WAR. Может быть, ОП может сказать нам, чего он или она хочет - person nandsito; 09.11.2016
comment
Есть лучшее локальное исправление WAR, чем это ... См. Связанный вопрос, вы можете настроить манифест непосредственно с помощью плагина WAR. - person Tunaki; 09.11.2016