spring boot加载jar(应用程序依赖项和外部文件系统jar)

时间:2014-01-24 18:35:34

标签: spring-boot

我试图找出以这样一种方式设置spring引导应用程序的最佳方法,即它有自己的jar依赖项,但是当它作为java -jar命令运行时,会在运行时将其他jar添加到classpath。什么方法更有意义

  1. 使用原始jar(不添加依赖项)并将所有jar(应用程序和运行时)放在文件系统上的文件夹中,并使用PropertiesLauncher指定jar.path到jars文件夹。

    < / LI>
  2. 使用fat jar(带有应用程序jar)将额外的jar放在文件系统上,并以某种方式将它们包含在需要添加到classpath的附加jar中。不知道如何做到这一点。

  3. 还有另一种更好的方法吗

3 个答案:

答案 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

效果很好。