Плагин сборки Maven 2 затирает некоторые файлы META-INF - PullRequest
9 голосов
/ 09 июня 2009

Я использую плагин сборки Maven 2 для создания JAR-файла с зависимостями и создания исполняемого файла JAR. Моя сборка включает Spring и библиотеку CXF.

CXF включает в себя копии файлов META-INF spring.schemas и spring.handlers, которые в итоге забивают аналогичные файлы из баночки spring-2.5.4.

Вручную, я могу обновить эти два файла в jar-with-dependencies.

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

Документация плагина сборки говорит о фильтрации файлов, но, похоже, не имеет конфигурации или параметров, не создавая пользовательский дескриптор сборки.

Является ли создание дескриптора пользовательской сборки моей единственной надеждой в этом случае?

Ответы [ 6 ]

7 голосов
/ 09 февраля 2011

По какой-то причине решение, которое предлагает Mojo и другие, все еще не работает для меня. Я создал свои пользовательские файлы spring.handlers и spring.schemas и поместил их в src/main/resources/META-INF. Однако при использовании unpackOptions мои файлы также не включаются. Когда я не использую unpackOptions, мои файлы не те, что в банке.

То, что я закончил, это ссылки на файлы напрямую. Это наконец положило мои файлы в JAR.

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <!-- TODO: a jarjar format would be better -->
    <id>jar-with-dependencies</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <unpack>true</unpack>
            <unpackOptions>
                <excludes>
                    <exclude>META-INF/spring.handlers</exclude>
                    <exclude>META-INF/spring.schemas</exclude>
                </excludes>
            </unpackOptions>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
    <files>
        <file>
            <source>${project.basedir}/src/main/resources/META-INF/spring.handlers</source>
            <outputDirectory>META-INF</outputDirectory>
        </file>
        <file>
            <source>${project.basedir}/src/main/resources/META-INF/spring.schemas</source>
            <outputDirectory>META-INF</outputDirectory>
        </file>
    </files>
</assembly>
5 голосов
/ 08 апреля 2011

Я попробовал подход с плагином Shade, и он работал очень хорошо. Вот все, что вам нужно вставить в POM (плагин для сборки не нужен).

      <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>org.example.Runner</mainClass>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.handlers</resource>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
5 голосов
/ 10 июня 2009

Я бы предложил использовать вместо этого maven-shade-plugin. Если вы посмотрите на pom для cxf-bundle (http://svn.apache.org/repos/asf/cxf/trunk/distribution/bundle/all/pom.xml)), вы увидите, как вы можете использовать шейдерные преобразователи для объединения Spring.schemas и других необходимых файлов.

1 голос
/ 10 ноября 2009

Вы также можете обойти эту проблему, получив файлы spring.schemas и spring.handlers из нужного вам дистрибутива spring и поместив их в каталог проектов src / main / resources / META-INF. Поскольку они упакованы в последнюю очередь, вы получите нужную версию. Я нашел идею здесь

1 голос
/ 10 июня 2009

Я разобрался, и вот подробности:

Во-первых, нет способа указать, что файл включает или исключает, если вы используете встроенный дескриптор сборки jar-with-dependencies.

В документации к подключаемому модулю сборки приведен пример дескриптора jar-with-dependencies .

Я скопировал и вставил этот дескриптор в файл в каталоге моего проекта с именем exec-jar.xml. Затем в помпе я изменил плагин сборки, чтобы ссылаться на этот дескриптор. Вот выдержка:

<build>
  <plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2-beta-3</version>
        <configuration>
            <descriptors>
                <descriptor>exec-jar.xml</descriptor>
            </descriptors>
            <archive>
                <manifest>
                    <mainClass>com.package.MyMainClass</mainClass>
                </manifest>
            </archive>
        </configuration>
        <executions>
            <execution>
                <id>make-assembly</id>
                <phase>package</phase>
                <goals>
                    <goal>single</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
  </plugins>
</build>

Этот бит дескриптора связывает сборку с фазой пакета жизненного цикла и ссылается на дескриптор exec-jar.xml. Выполнение этого пакета подтвердило, что jar-файл был построен так же, как и с предопределенным дескриптором.

Тогда возникает вопрос об изменении exec-jar.xml, чтобы исключить файлы CXF, конфликтующие с файлами Spring. Вот мой дескриптор сборки, который выполнил это:

<assembly>
  <id>jar-with-dependencies</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <unpack>true</unpack>
      <unpackOptions>
        <excludes>
            <exclude>cxf*/META-INF/spring.handlers</exclude>
            <exclude>cxf*/META-INF/spring.schemas</exclude>
        </excludes>
      </unpackOptions>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <directory>${project.build.outputDirectory}</directory>
    </fileSet>
  </fileSets>
</assembly>

Теперь вот руб. Если вы сделаете это с помощью выпускаемого в настоящее время подключаемого модуля сборки версии 2.1, для тега произойдет сбой как «неожиданный». Тег поддерживается в неизданной версии 2.2 плагина. Обратите внимание, что в приведенном выше отрывке из файла pom я указываю версию 2.2-beta-3 подключаемого модуля maven, которая была последней на момент написания.

Это успешно создало исполняемый файл jar, и Spring имел все обработчики и схемы, необходимые для инициализации моего приложения.

0 голосов
/ 25 мая 2018

Если вы получили ошибку с конфигом из ответа Моджо:

Ошибка: произошла ошибка JNI, пожалуйста, проверьте вашу установку и попробуйте снова Исключение в потоке "main" java.lang.SecurityException: неверный дайджест файла подписи для основных атрибутов Manifest

Для меня сработало следующее: http://zhentao -li.blogspot.de / 2012/06 / maven-shade-plugin-invalid-signature.html

  <filters>
    <filter>
      <artifact>*:*</artifact>
      <excludes>
        <exclude>META-INF/*.SF</exclude>
        <exclude>META-INF/*.DSA</exclude>
        <exclude>META-INF/*.RSA</exclude>
      </excludes>
    </filter>
  </filters>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...