Sprint-boot可执行文件同源多个jar

时间:2016-10-29 18:26:48

标签: spring-boot executable spring-boot-maven-plugin

我执行了以下步骤,以便在相同主机上运行我的spring-boot应用程序的2个实例

  • 使用spring-boot maven插件重新打包目标构建jar
  • 将application.jar复制到我的远程服务器上的application-0.jar
  • 使用APP_NAME = application-0
  • 创建了一个application-0.conf文件
  • 启动application-0.jar作为服务
  • 将application.jar复制到我的远程服务器上的application-1.jar
  • 使用APP_NAME = application-1
  • 创建了一个application-1.conf文件
  • 启动application-1.jar作为服务

然后我在应用程序1启动时遇到以下错误:已经提供了服务应用程序!

所以我意识到了:

  • linux服务名称是在jar中硬编码的,所以无论你复制jar多少次重命名它,服务都将保持不变(在我们的案例中是应用程序服务)
  • APP_NAME对服务名称没有影响。 .conf文件中的APP_NAME分别设置为application-0和application-1。我仍然遇到了这个问题。

我阅读了spring-boot插件文档,尝试在不同的弹簧上对 attach classifier embeddedLaunchScriptProperties.initInfoProvides 选项进行不成功的编译。引导maven插件执行相同的构建。

我还尝试在不同的maven配置文件中封装不同的执行。我还有一个原始的jar文件和一个弹簧启动罐。

因此,如果有人知道如何实现我的目标(相同的源,多个配置良好的Linux服务,因为我在同一主机上运行),我真的很感激帮助。

下面是不成功配置的示例:



<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <executions>
    <execution>
      <id>classic</id>
      <goals>
        <goal>repackage</goal>
      </goals>
      <configuration>
        <executable>true</executable>
      </configuration>
    </execution>
    <execution>
      <id>instance-0</id>
      <goals>
        <goal>repackage</goal>
      </goals>
      <configuration>
        <finalName>${project.artifactId}-0</finalName>
        <executable>true</executable>
        <classifier>exec</classifier>
        <attach>false</attach>
      </configuration>
    </execution>
    <execution>
      <id>instance-1</id>
      <goals>
        <goal>repackage</goal>
      </goals>
      <configuration>
        <finalName>${project.artifactId}-1</finalName>
        <executable>true</executable>
        <classifier>exec</classifier>
        <attach>false</attach>
      </configuration>
    </execution>
  </executions>
</plugin>
&#13;
&#13;
&#13;

谢谢

1 个答案:

答案 0 :(得分:1)

我使用 systemd

解决了这个问题
  • 构建单个 可执行文件 jar(没有多个Spring启动插件执行,没有maven配置文件,只是常规重新打包可执行目标)

  • 以绝对路径播放(/var/xxx/application.jar)

  • 使用以下配置创建您想要的任何/etc/systemd/system/application-{i}.service

    [单位] 描述=应用 - {I} 后= syslog.target

    [服务] ExecStart = / var / xxx / application.jar --server.port = 4500 {i} - logging.file = / var / log / xxx / application- {i} .log

    [安装] WantedBy = multi-user.target

请注意占位符{i}以避免服务名称,linstening端口和日志文件冲突。

Systemd解决了我的问题。

注意:如果您在同一主机上运行相同的服务实例,则只关心我的问题。如果您为每个主机运行一个服务实例(通用微服务方法),则不需要所有这些配置。

希望这可以帮助任何有同样问题的人。