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

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

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

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

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

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

11
Mojo 9 Июн 2009 в 20:33

6 ответов

Лучший ответ

По какой-то причине решение, которое предлагают Моджо и другие, все еще не работает для меня. Я создал свои собственные файлы 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>
7
magiconair 9 Фев 2011 в 03:56

Я попробовал использовать плагин тени, и он отлично сработал. Вот все, что вам нужно вставить в свой 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
amir 8 Апр 2011 в 19:06

Вместо этого я бы предложил использовать maven-shade-plugin. Если вы посмотрите на pom для cxf-bundle (https: // github. com / apache / cxf / blob / master / pom.xml) вы можете увидеть, как можно использовать преобразователи тени для объединения spring.schemas и других необходимых файлов.

5
Dwhitz 5 Авг 2020 в 09:21

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

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

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

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

<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 выше я указываю maven-assembly-plugin версии 2.2-beta-3, которая была последней на момент написания.

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

2
Mojo 9 Июн 2009 в 23:20

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

1
harschware 10 Ноя 2009 в 19:15

Если вы получили ошибку с конфигурацией из ответа Mojo:

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

Для меня сработало следующее: 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>
0
Julian Rost 25 Май 2018 в 19:37