【问题标题】:Running Standalone Jar need to add jar on server to run运行 Standalone Jar 需要在服务器上添加 jar 才能运行
【发布时间】:2018-02-14 17:22:36
【问题描述】:

我创建了一个 Spring Boot 作业,它依赖于服务器上的属性,我可以让它像这样运行,无需修改清单。

/bin/java -Dspring.config.location=/var/tmp/com.jdbc.properties -jar my.jar

它有效。但是该应用程序依赖于另一个 jar,它是一个位于 /usr/local/share/jni/foo.jar 下的内部 jar,我想将其添加到此组合中。

我已经尝试了无数次尝试,例如: java -cp /usr/local/share/jni/foo.jar -Dspring(取原行)

当我开始在谷歌上搜索这个时,它带我进入了神奇的跑步之旅: 'org.springframework.boot.loader.JarLauncher' 或者 'org.springframework.boot.loader.PropertiesLauncher' 然后处理清单等。

过去 4 小时没有成功。是否有运行需要使用远程属性文件和附加 jar 文件的独立 jar 的最佳实践?如果可能,希望保持简单。

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    如果您正在使用 Spring Boot 并希望拥有一个封装所有依赖项的 Fat-jar,那么最好的方法是将所需的 Jar 作为依赖项添加到您的项目中。

    假设您使用 Maven 构建项目,则需要将“foo.jar”作为 Maven 依赖项添加到您的项目中。然后,spring Boot maven 插件将拾取 jar 并将其包含在您的 Fat-jar 中。

    即使“foo.jar”在任何 Maven 存储库中都不存在,您仍然可以使用 Maven 命令 mvn install:install-file (See Maven doc) 手动将其添加到本地 Maven 存储库。

    【讨论】:

      【解决方案2】:

      您是否尝试在 maven/gradle 依赖项中使用 foo.jar 作为 provided 依赖项并将项目构建为可执行的 war 文件?

      参见spring boot's maven plugin 对构建可执行战争文件的描述。

      【讨论】:

      • 我按照提供的方式制作了 foo.jar,然后发现您还必须将它排除在 spring-boot-maven-plugin 中,否则它会显示在 jar 中。我在本地使用 jar 文件进行构建,但在进行调用时必须确保它仅存在于服务器上。所以这件事已经处理了。至于建立战争,我不确定这是否是一种选择,因为它部署在 jvm 而不是容器上。我们在那里运行了一堆 Spring Batch 作业,这是第一次将 Spring Boot 作为 jar 运行。我可能会放弃这个启动目标,在我的生活中造成太多的焦虑。感谢您的回复。
      【解决方案3】:

      总体而言。在 Linux 服务器上运行 spring boot 独立 jar。此外,从服务器上的静态文件中读取数据库属性,以及添加仅存在于服务器上的功能的 jar 文件中的路径。不能包含在引导库中。

      命令行运行(将转换为shell)并运行。 /path/to/..openjdk-1.7.0.55.x86_64/bin/java -cp /usr/somewhere/jni/Foo.jar:/path/where/lib/MYBOOTJAR.jar org.springframework.boot.loader.JarLauncher --spring.config.location=/path/to/properties/on/server/com.xxx.yyy.zzz.jdbc.properties

      好像在使用 JarLauncher(没有修改清单,除了从本地排除 Foo.jar)

      希望这对其他人有所帮助。

      【讨论】:

        最近更新 更多