Не удалось получить вложенный архив для записи BOOT-INF / lib для jar, созданного с помощью maven-shaded-plugin - PullRequest
0 голосов
/ 20 марта 2019

Я использую spring-boot-maven-plugin: 2.1.0.RELEASE для упаковки моего основного приложения.Это приложение имеет все общие зависимости и т.д., упакованные

. В отдельном проекте я создаю затененный jar-файл, используя maven-shade-plugin: 2.4.3, и внедряю его в мое весеннее загрузочное приложение в каталоге BOOT-INF / lib, используяorg.codehaus.mojo: truezip-Maven-плагин: 1.1.Теперь, когда я запускаю свое приложение для весенней загрузки, я получаю следующее исключение:

ingester_1         | Listening for transport dt_socket at address: 40500
ingester_1         | Exception in thread "main" java.lang.IllegalStateException: Failed to get nested archive for entry BOOT-INF/lib/ms-holdings-package-docker-DEV.0.0-SNAPSHOT.jar
ingester_1         |    at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:108)
ingester_1         |    at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchives(JarFileArchive.java:86)
ingester_1         |    at org.springframework.boot.loader.ExecutableArchiveLauncher.getClassPathArchives(ExecutableArchiveLauncher.java:70)
ingester_1         |    at org.springframework.boot.loader.Launcher.launch(Launcher.java:49)
ingester_1         |    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
ingester_1         | Caused by: java.io.IOException: Unable to open nested jar file 'BOOT-INF/lib/ms-holdings-package-docker-DEV.0.0-SNAPSHOT.jar'
ingester_1         |    at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:256)
ingester_1         |    at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:241)
ingester_1         |    at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:103)
ingester_1         |    ... 4 more
ingester_1         | Caused by: java.lang.IllegalStateException: Unable to open nested entry 'BOOT-INF/lib/ms-holdings-package-docker-DEV.0.0-SNAPSHOT.jar'. It has been compressed and nested jar files must be stored without compression. Please check the mechanism used to create your executable jar file
ingester_1         |    at org.springframework.boot.loader.jar.JarFile.createJarFileFromFileEntry(JarFile.java:284)
ingester_1         |    at org.springframework.boot.loader.jar.JarFile.createJarFileFromEntry(JarFile.java:264)
ingester_1         |    at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:252)
ingester_1         |    ... 6 more

Я попытался скопировать jar-файл внутри BOOT-INF / lib, непосредственно вытащив maven-truezip-plugin, но все так же.Есть ли в любом случае, я могу решить это?или обходной путь?

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Исправление для нас, то же самое сообщение об ошибке, было использовать только spring-boot-maven-plugin (который создает для вас работоспособную банку) вместо использования плагина shade и запуска его из этой баночки.

0 голосов
/ 27 марта 2019

ОК, чтобы решить проблему, в моей сборке пакета maven;

1) Invoked ANT to unzip the released template SPRING-BOOT-app.jar
2) Unzip and repackage additional shaded artefact from the project
3) Copy repackaged artefact under BOOT-INF/lib
4) Repackage SPRING-BOOT-app.jar

Мой pom теперь имеет следующий дополнительный шаг:

pom.xml

    <plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
        <execution>
            <id>repackage-app</id>
            <phase>package</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <target name="repack-app">
                    <property name="workDirectory" value="${project.build.directory}/app-repack" />
                    <property name="sourceArtifact" value="${project.build.directory}/SPRING-BOOT-app.jar" />
                    <property name="appendWith" value="${project.build.directory}/${project.artifactId}-${project.version}.jar" /> 
                    <ant antfile="${packager.utilities.directory}/build.xml"> 
                        <target name="append-and-repack-spring-boot-artiafact" />
                    </ant>
                </target>
            </configuration>
        </execution>
    </executions>
</plugin>

build.xml

    <?xml version="1.0" encoding="UTF-8"?>
<project name="utilities" basedir=".">

    <!-- Repack and append artifact to Spring Boot App -->
    <target name="append-and-repack-spring-boot-artiafact">

        <!-- Clean -->
        <delete dir="${workDirectory}" failonerror="false"/>
        <mkdir dir="${workDirectory}" />

        <!-- Copy the original files -->
        <copy file="${sourceArtifact}" todir="${workDirectory}"/>
        <copy file="${appendWith}" todir="${workDirectory}" />

        <!-- Get basename -->
        <basename property="sourceArtifactName" file="${sourceArtifact}" />
        <basename property="appendArtifactName" file="${appendWith}" />

        <!-- repackage and append -->
        <repack-jar artifact="${appendArtifactName}" reworkOutputDir="${workDirectory}/repackaged" />
        <append artifact="${sourceArtifactName}" appendFrom="${workDirectory}/repackaged" location="BOOT-INF/lib" />

    </target>

    <!-- Repackage a single jar -->
    <macrodef name="repack-jar">
        <attribute name="artifact" />
        <attribute name="reworkOutputDir" />
        <sequential>
            <echo
                message="-------------- Repackaging @{artifact} --------------" />
            <!-- Unpack and delete jar -->
            <unzip dest="${workDirectory}/tmp" src="${workDirectory}/@{artifact}" />
            <delete file="${workDirectory}/@{artifact}" />

            <!-- Package jar -->
            <jar manifest="${workDirectory}/tmp/META-INF/MANIFEST.MF"
                compress="false" basedir="${workDirectory}/tmp"
                destfile="@{reworkOutputDir}/@{artifact}" />
            <delete dir="${workDirectory}/tmp" />
        </sequential>
    </macrodef>

    <!-- Append artifact to jar -->
    <macrodef name="append">
        <attribute name="artifact" />
        <attribute name="appendFrom" />
        <attribute name="location" />
        <sequential>
            <echo
                message="-------------- Unpacking @{artifact} --------------" />
            <!-- Unpack and delete jar -->
            <unzip dest="${workDirectory}/tmp" src="${workDirectory}/@{artifact}" />
            <delete file="${workDirectory}/@{artifact}" />

            <copy todir="${workDirectory}/tmp/@{location}" overwrite="true" force="true">
                <fileset dir="@{appendFrom}" includes="*.jar" />
            </copy>

            <!-- Package jar -->
            <jar manifest="${workDirectory}/tmp/META-INF/MANIFEST.MF"
                compress="false" basedir="${workDirectory}/tmp"
                destfile="${workDirectory}/@{artifact}" />
            <delete dir="${workDirectory}/tmp" />
        </sequential>
    </macrodef>
</project>

ПРИМЕЧАНИЕ. НЕ ИСПОЛЬЗУЙТЕ 7Zip / Winrar или любые другие инструменты сжатия, чтобы открыть приложение Spring Boot, которым вы являетесьпланируем развернуть.Это обновит смещение сжатия (или что-то в этом роде), и приложение выйдет из строя.Только не трогайте артефакт, возьмите копию и осмотрите!

...