我正在尝试利用我公司的Maven存储库上托管的现有Spring Boot应用程序。此应用程序从Kafka服务器获取消息并将它们放在Mongo数据库中。使其工作所需的只是为其提供定义Kafka和Mongo服务器的属性文件。我需要创建一个Maven项目,将该应用程序作为依赖项导入,并为其提供配置的属性文件。只有两个文件应该是pom.xml和application.properties。最终结果应该是一个可运行的JAR,它使用我的属性文件执行依赖项(现有的Spring Boot应用程序)。
我没有选择采取不同的方法来解决这个问题。
我花了无数个小时试图配置Maven来做到这一点。在使用mvn spring-boot:run
命令时,我终于成功地使其工作,但我无法让它生成正常工作的可运行JAR文件。
我像其他任何人一样包括我的依赖:
<dependencies>
<dependency>
<groupId>com.company.dept</groupId>
<artifactId>consume-to-mongo-app</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
然后,我从依赖项中定义主类,如下所示:
<properties>
<mainClass>org.springframework.boot.loader.JarLauncher</mainClass>
</properties>
而且,我的插件部分看起来像这样:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>org.springframework.boot.loader.JarLauncher</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
<mainClass>org.springframework.boot.loader.JarLauncher</mainClass>
</configuration>
</execution>
</executions>
</plugin>
运行mvn spring-boot:run
时应用程序运行正常
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.4.RELEASE)
运行mvn clean package
,然后java -jar myjar.jar
我得到成千上万的这些:
)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Caused by: java.lang.reflect.InvocationTargetException
... 1024 more
我能够通过使用Maven Assembly Plugin创建一个包含我的依赖项JAR和我的属性文件的自定义压缩ZIP文件来解决我的问题。在部署服务器上,可以解压缩此ZIP,并且可以在生成的目录中运行jar,它将获取属性文件。我按照本教程:https://medium.com/@kasunpdh/using-the-maven-assembly-plugin-to-build-a-zip-distribution-5cbca2a3b052。
我从教程中做了一些修改,让我的最终ZIP结构直接包含我的Spring Boot App依赖项的JAR和我的属性文件,其中没有包含其他目录。这是我修改过的zip.xml文件:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<!--<modelVersion>4.0.0</modelVersion>-->
<id>zip</id>
<includeBaseDirectory>true</includeBaseDirectory>
<formats>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<directory>${project.basedir}/src/main/resources</directory>
<outputDirectory>.</outputDirectory>
</fileSet>
</fileSets>
<dependencySets>
<dependencySet>
<outputDirectory>.</outputDirectory>
<excludes>
<exclude>${project.groupId}:${project.artifactId}:jar:*</exclude>
</excludes>
</dependencySet>
</dependencySets>
</assembly>