/ BOOT-INF / classes (нет такого файла или каталога) в весеннем загрузочном java-проекте

Пытаясь создать автономный JAR-файл, который я мог бы запускать чисто и независимо, я столкнулся с проблемами, связанными с Jersey и моим желанным толстым JAR-файлом. Последняя банка будет перемещена в образ Docker.

Ошибка, которую я получаю, по сути такова:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.glassfish.jersey.server.ResourceConfig]: Factory method 'jerseyResourceConfig' threw exception; nested exception is org.glassfish.jersey.server.internal.scanning.ResourceFinderException: java.io.FileNotFoundException: /dir/myproject-1.0.0-SNAPSHOT.jar!/BOOT-INF/classes (No such file or directory)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
    ... 48 common frames omitted
Caused by: org.glassfish.jersey.server.internal.scanning.ResourceFinderException: java.io.FileNotFoundException: /dir/myproject/target/myproject-1.0.0-SNAPSHOT.jar!/BOOT-INF/classes (No such file or directory)
    at org.glassfish.jersey.server.internal.scanning.JarZipSchemeResourceFinderFactory.create(JarZipSchemeResourceFinderFactory.java:89)
    at org.glassfish.jersey.server.internal.scanning.JarZipSchemeResourceFinderFactory.create(JarZipSchemeResourceFinderFactory.java:65)
    at org.glassfish.jersey.server.internal.scanning.PackageNamesScanner.addResourceFinder(PackageNamesScanner.java:282)
    at org.glassfish.jersey.server.internal.scanning.PackageNamesScanner.init(PackageNamesScanner.java:198)
    at org.glassfish.jersey.server.internal.scanning.PackageNamesScanner.<init>(PackageNamesScanner.java:154)
    at org.glassfish.jersey.server.internal.scanning.PackageNamesScanner.<init>(PackageNamesScanner.java:110)
    at org.glassfish.jersey.server.ResourceConfig.packages(ResourceConfig.java:680)
    at org.glassfish.jersey.server.ResourceConfig.packages(ResourceConfig.java:660)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
    ... 49 common frames omitted
Caused by: java.io.FileNotFoundException: /dir/myproject/target/myproject-1.0.0-SNAPSHOT.jar!/BOOT-INF/classes (No such file or directory)

Вот мой профиль сборки в моем файле POM:

<profile>
    <id>d2</id>
    <activation>
        <activeByDefault>false</activeByDefault>
    </activation>
    <properties>
        <packaging.type>jar</packaging.type>
        <log.dir>logs</log.dir>
        <!-- updates bootstrap.properties -->
        <config.override.path>./conf</config.override.path>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <requiresUnpack>
                        <dependency>
                            <groupId>my.com</groupId>
                            <artifactId>myArtifact</artifactId>
                        </dependency>
                    </requiresUnpack>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</profile>

Наконец, вот все зависимости от трикотажа, которые я использую:

org.springframework.boot:spring-boot-starter-jersey:jar:1.5.12.RELEASE:compile
|  |  +- org.glassfish.jersey.core:jersey-server:jar:2.25.1:compile
|  |  |  +- org.glassfish.jersey.core:jersey-client:jar:2.25.1:compile
|  |  |  +- org.glassfish.jersey.media:jersey-media-jaxb:jar:2.25.1:compile
|  |  +- org.glassfish.jersey.containers:jersey-container-servlet:jar:2.25.1:compile
|  |  +- org.glassfish.jersey.ext:jersey-bean-validation:jar:2.25.1:compile
|  |  +- org.glassfish.jersey.ext:jersey-spring3:jar:2.25.1:compile
|  |  \- org.glassfish.jersey.media:jersey-media-json-jackson:jar:2.25.1:compile
|  |     +- org.glassfish.jersey.ext:jersey-entity-filtering:jar:2.25.1:compile
................................................................................
|     |  +- org.glassfish.jersey.connectors:jersey-apache-connector:jar:2.17:compile
................................................................................
|  \- io.swagger:swagger-jersey2-jaxrs:jar:1.5.6:compile
|     +- org.glassfish.jersey.containers:jersey-container-servlet-core:jar:2.25.1:compile
|     |  +- org.glassfish.hk2.external:javax.inject:jar:2.5.0-b32:compile
|     |  \- org.glassfish.jersey.core:jersey-common:jar:2.25.1:compile
|     |     +- org.glassfish.jersey.bundles.repackaged:jersey-guava:jar:2.25.1:compile
|     \- org.glassfish.jersey.media:jersey-media-multipart:jar:2.25.1:compile

Я прочитал все источники, на которые ссылается этот ТАК вопрос. Я прошел через несколько проблем с github, которые, по-видимому, исправили как Spring, так и Jersey, но я все еще сталкиваюсь с этими проблемами. Уникальность моего усложнения заключается в том, что не найденные boot-inf / классы находятся прямо внутри моей банки и ссылаются на сам проект. Он не жалуется на разные, зависящие от jar, жалобы на собственные / BOOT-INF / классы проекта.

Любая дополнительная информация, не упомянутая в вышеупомянутом вопросе SO, была бы чрезвычайно полезной! Я считаю, что работать с Java в Docker невероятно сложнее, чем с любым другим стеком, с которым я сталкивался (python-django и node-js). Сообщите мне, если требуется дополнительная информация.

Я также хотел бы использовать плагин, такой как Spotify, который может автоматически создавать образы докеров; однако, похоже, существуют те же проблемы.

Chad Van De Hey 31.05.2018 23:36

У меня была аналогичная проблема, когда я использовал ResourceConfig.package (...) для регистрации конечных точек.

Pat 17.08.2018 10:23

Вы когда-нибудь находили решение этой проблемы?

Ankur Garg 01.04.2019 05:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
3
4 623
1

Ответы 1

Попробуйте добавить следующий плагин

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> </plugin>

Подробнее об этом https://maven.apache.org/plugins/maven-shade-plugin/

Другие вопросы по теме