我试图找出以这样一种方式设置spring引导应用程序的最佳方法,即它有自己的jar依赖项,但是当它作为java -jar命令运行时,会在运行时将其他jar添加到classpath。什么方法更有意义
使用原始jar(不添加依赖项)并将所有jar(应用程序和运行时)放在文件系统上的文件夹中,并使用PropertiesLauncher指定jar.path到jars文件夹。
< / LI>使用fat jar(带有应用程序jar)将额外的jar放在文件系统上,并以某种方式将它们包含在需要添加到classpath的附加jar中。不知道如何做到这一点。
还有另一种更好的方法吗
答案 0 :(得分:6)
PropertiesLauncher
旨在与胖罐一起使用,因此您应该能够保留胖罐并在外部位置添加任意数量的附加依赖项,例如:与loader.path=/opt/app/lib:lib
。我想这是你的选择2?如果它不起作用,我们可以在github问题中讨论。
答案 1 :(得分:4)
我使用以下spring-boot-maven-plugin配置解决了这个问题,我必须构建我的Uber jar而不排除工件来创建我的外部&#34; lib&#34;目录,然后我再次添加了我的排除工件,并仅使用我的应用程序特定依赖项打包我的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>
然后,我将以下属性添加到我的&#34; application.properties&#34;在我的罐子里面#34;资源/&#34; dir指定我的&#34; lib&#34; Spring PropertiesLauncher的目录,我把&#34; lib&#34; dir和我的jar在同一个dir。
loader.path=lib/
最后,我使用以下命令运行我的jar
java -jar back-tester-0.0.1-beta-01.jar
此外,您可以添加&#34; loader.path&#34;命令行的属性,而不将其放在&#34; application.properties&#34;就像下面的命令一样,但这种方式对我不起作用,因为我将jar打包为可执行的jar,我作为linux服务运行。
java -Dloader.path="lib/" -jar back-tester-0.0.1-beta-01.jar
现在,我成功地将我的jar大小从29 M减少到只有1 M jar,其中只包含我的应用程序特定的库,它开箱即用。
答案 2 :(得分:0)
谢谢@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>
然后放置./lib文件夹,其中包含两个jar文件,两个文件被排除在上面,并带有my-main-spring-boot-app.jar文件,然后运行:
java -Dloader.path="lib/" -jar my-main-spring-boot-app.jar
效果很好。