Как создать исполняемую банку на основе spring с maven?
у меня есть клиентский проект Spring-WS на основе Maven, который я хочу упаковать как одну банку. В Eclipse, все работает правильно. Когда я пытаюсь упаковать его как исполняемую банку, я получаю исключения ClassNotFound, так как весенние банки не включены в мою банку приложений.
поэтому я добавил Maven-shade-плагин чтобы включить все мои зависимости в мою банку приложений. Когда я смотрю на свою банку приложений, я вижу все файлы классов из всех включенных зависимостей (все библиотека 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.схемы файлы, которые заменяют друг друга. Следовательно, моя последняя банка имеет неполную пружину.файл схемы.
поэтому, когда я пытаюсь запустить исполняемую банку, я получаю сообщения об ошибках Spring, что файлы не могут быть найдены с весны.файл схем неполон (jar Spring-WS переопределил Spring-core весна.schemas file).
мета-INF/весна моего исполняемого 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
вместо весенних бобов.jar META-INF/spring.схемы:
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
Я в тупике. Я не уверен, что/как я могу упаковать все как одну исполняемую банку. Я не знаю, является ли это проблемой конфигурации shade-plugin, или если я пытаюсь сделать что-то невозможное. Казалось бы, неправильно, что мне придется вручную создавать свою собственную пружину.файл схем (конкатенация другие.)
возможно, я немного поторопился. Выкапывая больше информации о плагине shade, я заметил AppendingTransformer что я ранее пропустил. Однако, меня беспокоит то, какие другие файлы имеют те же проблемы? Я обнаружил / поймал этот весенний выпуск. Я понятия не имею о других библиотеках, которые могут делать что-то подобное...
любые предложения будут оценены.
5 ответов
вместо Maven-shade-plugin используйте onejar-maven-plugin. одну банку позволяет упаковать приложение Java вместе с его зависимостями Jars в один исполняемый файл 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 недостаточно - вы не можете быть уверены в наличии смешанных файлов, попробуйте сохранить экспорт всех зависимостей как есть...
вы пробовали maven-сборка-плагин ?
он создаст одну банку с зависимостями для вас и morevover он может сделать эту банку исполняемой:
использовать 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>
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>