Spring загрузочные банки загрузки (зависимости приложений и внешние банки файловой системы)

Я пытаюсь выяснить, что является лучшим способом установки загрузочного приложения spring таким образом, что у него есть свои собственные зависимости jar, но дополнительные кувшины добавляются в classpath во время выполнения, когда его запускают как java -jar команда. Какой подход имеет больше смысла

  • Используйте исходную банку (без добавленных зависимостей) и поместите все банки (приложение и время выполнения) в папку в файловой системе и используйте PropertiesLauncher, чтобы указать папку loader.path для jars.

    /li >
  • Используйте жировую банку (с банками приложений), поместите дополнительные банки в файловую систему и как-то включите их в качестве дополнительных банок, которые необходимо добавить в classpath. Не знаете, как это можно сделать.

  • Есть ли еще лучший способ сделать это

Ответ 1

PropertiesLauncher был разработан для работы с жировыми банками, поэтому вы должны иметь возможность держать жирную банку и добавлять столько дополнительных зависимостей, сколько хотите во внешнем месте, например. с loader.path=/opt/app/lib:lib. Я предполагаю, что ваш вариант 2? Если это не сработает, мы можем обсудить проблему github.

Ответ 2

Я решил эту проблему, используя следующую конфигурацию spring-boot-maven-plugin, мне пришлось собрать свой Uber jar без исключенных артефактов, чтобы создать мой внешний каталог "lib", затем я снова добавил свои исключенные артефакты и упаковал их мой Uber jar только с конкретными зависимостями моего приложения.

           <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>1.3.1.RELEASE</version>
                <configuration>
                    <layout>ZIP</layout>
                    <executable>true</executable>
                    <excludeArtifactIds>
                        <!-- My libs which will be packaged with my Uber jar-->
                        <!-- core,data-feeder,engine,lightspeed-tcp-api,order-manager,store,strategies,utils,viewer -->
                        <!-- Other libs -->
                        antlr,aopalliance,aspectjrt,aspectjweaver,classmate,commons-lang,
                        dom4j,h2,hibernate-commons-annotations,hibernate-core,hibernate-entitymanager,
                        hibernate-jpa-2.1-api,hibernate-validator,jackson-annotations,jackson-core,jackson-databind,
                        jandex,javassist,javax.transaction-api,jboss-logging,jboss-logging-annotations,jcl-over-slf4j,
                        jul-to-slf4j,log4j-over-slf4j,logback-classic,logback-core,mysql-connector-java,slf4j-api,
                        snakeyaml,spring-aop,spring-aspects,spring-beans,spring-boot,spring-boot-autoconfigure,
                        spring-boot-starter,spring-boot-starter-aop,spring-boot-starter-data-jpa,spring-boot-starter-jdbc,
                        spring-boot-starter-logging,spring-boot-starter-tomcat,spring-boot-starter-web,
                        spring-boot-starter-websocket,spring-context,spring-core,spring-data-commons,spring-data-jpa,
                        spring-expression,spring-jdbc,spring-messaging,spring-orm,spring-tx,spring-web,spring-webmvc,
                        spring-websocket,tomcat-embed-core,tomcat-embed-el,tomcat-embed-logging-juli,tomcat-embed-websocket,
                        tomcat-jdbc,tomcat-juli,validation-api,xml-apis
                    </excludeArtifactIds>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

Затем я добавил следующее свойство к своему "application.properties", которое находится внутри моего jar "resources/" dir, чтобы указать мой "lib" dir для Spring PropertiesLauncher, куда я поместил "lib" dir с моей банкой в том же каталоге.

loader.path=lib/

Наконец, я запустил банку с помощью следующей команды

java -jar back-tester-0.0.1-beta-01.jar

Кроме того, вы можете добавить свойство "loader.path" в командную строку, не помещая его в свои "application.properties", как в следующей команде, но этот способ не сработал со мной, так как я упаковал свой jar файл как исполняемый файл тот, который я использую в качестве службы Linux.

java -Dloader.path="lib/" -jar back-tester-0.0.1-beta-01.jar

Теперь я успешно уменьшил размер своей банки с 29 до всего 1 метра, который содержит только специфичные для моего приложения библиотеки и работает из коробки.

Ответ 3

спасибо @Ashraf Sarhan, вы спасаете мои два дня :) Я добавил в файл pom:

         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <layout>ZIP</layout>
                <executable>true</executable>
                <mainClass>vn.com.Mymainclass</mainClass>
                <excludes>
                    <exclude>
                        <groupId>com.vn.groupId</groupId>
                        <artifactId>excluded-id-a</artifactId>
                    </exclude>
                    <exclude>
                        <groupId>com.vn.groupId</groupId>
                        <artifactId>excluded-id-b</artifactId>
                    </exclude>
                </excludes>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

И папка Placed./lib, содержащая два файла jar из двух файлов, которые исключены выше, кроме файла my-main-spring-boot-app.jar, и я запустил:

java -Dloader.path="lib/" -jar my-main-spring-boot-app.jar

Это сработало отлично.