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