Apache camel - упаковка исполняемой банки

Я использую maven для создания моей банки (Intellij IDEA IDE). Это приложение построено с помощью Apache Camel. Выдержка из моего pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <mainClass>MainDriver</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

Я могу получить файл jar из maven, но при запуске все, что я получил, это ошибки NoClassDeFFound.

Наконец, я попытался использовать плагин one-jar (http://one-jar.sourceforge.net/). И у меня это работает. Мой вопрос: могу ли я достичь того же, не используя одну банку? Мне не нравится упаковка одной банки, что она делает, когда вы извлекаете банку из одной банки, вы найдете в ней свою банку приложений, поэтому вам нужно будет сделать дополнительную добычу на своей банке, чтобы получить к вашим классам/ресурсам. Мои файлы конфигурации находятся на ресурсах и время от времени мне нужно будет его модифицировать.

Спасибо!

Ответ 1

Плагин maven-shade создает банку с кодом приложения, а все зависимости объединяются в один файл jar. Проблема с этим подходом заключается в том, что вам нужно решить, что делать с файлами с конфликтующими именами. Это конфигурация, которую мы используем для создания исполняемых JAR для наших приложений Camel, включая Spring и все необходимые зависимости.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>1.5</version>
    <configuration>
        <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>org.apache.camel.spring.Main</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>
            <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                <resource>META-INF/spring.tooling</resource>
            </transformer>
            <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                <resource>META-INF/cxf/bus-extensions.txt</resource>
            </transformer>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
            <transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                <resource>META-INF/INDEX.LIST</resource>
            </transformer>
            <transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                <resource>META-INF/MSFTSIG.SF</resource>
            </transformer>
            <transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                <resource>META-INF/MSFTSIG.RSA</resource>
            </transformer>
        </transformers>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Ответ 2

Вы можете использовать maven-jar-plugin

<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
    <archive>
        <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>com.poc.sms.MainApp</mainClass>
        </manifest>
    </archive>
</configuration>
</plugin>