Как создать исполняемый jar на основе пружин с Maven?
У меня есть клиентский проект Spring-WS на основе Maven, который я хочу упаковать в один файл. В затмении все работает правильно. Когда я пытаюсь упаковать его как исполняемый файл jar, я получаю исключения ClassNotFound, поскольку файлы Spring не включены в мой файл приложения.
Поэтому я добавил maven-shade-plugin, чтобы включить все мои зависимости в jar приложения. Когда я смотрю на jar своего приложения, я вижу все файлы классов из всех включенных зависимостей (все jar библиотеки взорваны).
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.cws.cs.Client</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Моя проблема в том, что в процессе упаковки мои множественные зависимости Spring имеют разные файлы META-INF/spring.schemas, которые перекрывают друг друга. Следовательно, у моего последнего фляги есть неполный файл spring.schemas.
Поэтому, когда я пытаюсь запустить свой исполняемый файл jar, я получаю сообщения об ошибках Spring, что файлы не могут быть найдены, поскольку файл spring.schemas является неполным (файл jar Spring-WS переопределил файл spring.schemas в ядре Spring).
META-INF/spring.schemas моего исполняемого файла jar:
http\://www.springframework.org/schema/web-services/web-services-1.5.xsd=/org/springframework/ws/config/web-services-1.5.xsd
http\://www.springframework.org/schema/web-services/web-services-2.0.xsd=/org/springframework/ws/config/web-services-2.0.xsd
http\://www.springframework.org/schema/web-services/web-services.xsd=/org/springframework/ws/config/web-services-2.0.xsd
Вместо Spring-beans.jar META-INF/spring.schemas:
http\://www.springframework.org/schema/beans/spring-beans-2.0.xsd=org/springframework/beans/factory/xml/spring-beans-2.0.xsd
http\://www.springframework.org/schema/beans/spring-beans-2.5.xsd=org/springframework/beans/factory/xml/spring-beans-2.5.xsd
http\://www.springframework.org/schema/beans/spring-beans-3.0.xsd=org/springframework/beans/factory/xml/spring-beans-3.0.xsd
http\://www.springframework.org/schema/beans/spring-beans-3.1.xsd=org/springframework/beans/factory/xml/spring-beans-3.1.xsd
http\://www.springframework.org/schema/beans/spring-beans.xsd=org/springframework/beans/factory/xml/spring-beans-3.1.xsd
http\://www.springframework.org/schema/tool/spring-tool-2.0.xsd=org/springframework/beans/factory/xml/spring-tool-2.0.xsd
http\://www.springframework.org/schema/tool/spring-tool-2.5.xsd=org/springframework/beans/factory/xml/spring-tool-2.5.xsd
http\://www.springframework.org/schema/tool/spring-tool-3.0.xsd=org/springframework/beans/factory/xml/spring-tool-3.0.xsd
http\://www.springframework.org/schema/tool/spring-tool-3.1.xsd=org/springframework/beans/factory/xml/spring-tool-3.1.xsd
http\://www.springframework.org/schema/tool/spring-tool.xsd=org/springframework/beans/factory/xml/spring-tool-3.1.xsd
http\://www.springframework.org/schema/util/spring-util-2.0.xsd=org/springframework/beans/factory/xml/spring-util-2.0.xsd
http\://www.springframework.org/schema/util/spring-util-2.5.xsd=org/springframework/beans/factory/xml/spring-util-2.5.xsd
http\://www.springframework.org/schema/util/spring-util-3.0.xsd=org/springframework/beans/factory/xml/spring-util-3.0.xsd
http\://www.springframework.org/schema/util/spring-util-3.1.xsd=org/springframework/beans/factory/xml/spring-util-3.1.xsd
http\://www.springframework.org/schema/util/spring-util.xsd=org/springframework/beans/factory/xml/spring-util-3.1.xsd
Я в тупике. Я не уверен, если / как я могу упаковать все как один исполняемый файл jar. Я не знаю, является ли это проблемой с настройкой плагина-тени или я пытаюсь сделать что-то невозможное. Было бы неправильно, если бы мне пришлось вручную создавать свой собственный файл spring.schemas (объединение других).
Возможно, я немного подпрыгнул. В поисках дополнительной информации о плагине Shade я заметил AppendingTransformer, который я ранее пропустил. Тем не менее, меня беспокоит, как узнать, какие другие файлы имеют такие же проблемы? Я обнаружил / поймал эту конкретную проблему Spring. Я понятия не имею о каких-либо других библиотеках, которые могут делать что-то подобное...
Мы ценим любые предложения.
7 ответов
Вместо maven-shade-plugin используйте http://code.google.com/p/onejar-maven-plugin/. One-JAR позволяет вам упаковать Java-приложение вместе с его Jars-зависимостями в один исполняемый Jar-файл.
Вы можете добавить следующую конфигурацию, чтобы содержимое файлов.schema из всех jar-файлов добавлялось вместе.
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
Вчера я тоже столкнулся с этой проблемой.
Решением было подготовить требуемые файлы путем ручной конкатенации и настройки сборочного плагина следующим образом:
<files>
<file>
<source>src/META-INF/spring.schemas</source>
<outputDirectory>META-INF</outputDirectory>
</file>
<file>
<source>src/META-INF/spring.handlers</source>
<outputDirectory>META-INF</outputDirectory>
</file>
</files>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>runtime</scope>
<unpackOptions>
<excludes>
<exclude>META-INF/spring.handlers</exclude>
<exclude>META-INF/spring.schemas</exclude>
</excludes>
</unpackOptions>
</dependencySet>
</dependencySets>
ПРИМЕЧАНИЕ: использование одного jar-подхода недостаточно хорошо - вы не можете быть уверены в наличии смешанных файлов, попробуйте сохранить экспорт всех зависимостей как есть...
assembly plugin have issues, use below plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>at.seresunit.lecturemanager_connector.App</mainClass>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
you may get security exception resolve it using below configuration
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
Вы пробовали maven-сборка-плагин?
Он создаст для вас один jar с зависимостями и, более того, он может сделать этот jar исполняемым:
Используйте mainClass, чтобы указать класс, который вы хотите выполнить.
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.3</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>org.sample.App</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Для людей, которые надеялись найти ответ для приложений Spring Boot, все, что вам нужно, это:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Создайте с помощью maven, и у вас будет толстая банка в дополнение к банке, которую создает maven.
У меня была точно такая же проблема после обновления до Spring 6.0.0. В моем проекте есть сборка xml, и я исправил проблему spring.schemas и spring.handlers, добавив следующий обработчик в раздел <assembly>:
<containerDescriptorHandlers>
<containerDescriptorHandler>
<handlerName>metaInf-spring</handlerName>
</containerDescriptorHandler>
</containerDescriptorHandlers>
Это задокументировано в https://maven.apache.org/plugins/maven-assembly-plugin/examples/single/using-container-descriptor-handlers.html .