spring boot项目中多个main函数入口的处理办法

在最近的一个项目里,使用spring boot开发项目(非web项目),项目里有几个功能独立的java类,需要在一个jar包里独立运行,如下图。

QQ截图20170519170348

在网上找如何把spring boot项目打包成jar的资料,它们会告诉你。在pom.xml里,这样配置:

			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
			</plugin>

然后执行在命令行里执行

mvn clean package

这个方法只能处理一个项目里只有一个main函数的情况。否则会报错,比如:

QQ截图20170526135110

maven告诉你,这里有多个java类拥有main函数,打包失败。

解决问题之前,先来看一下使用spring-boot-maven-plugin打包好的jar里面的MANIFEST.MF文件。

QQ截图20170526141219

看了这个文件就一目了然了,jar的执行入口是org.springframework.boot.loader.JarLauncher类,然后再去执行真正的业务类CleanDatabaseApp。

看到这里就有思路了,我们只要动态变化start-class的值,就可以实现一个jar多个main函数了。

在spring boot里有一个launcher叫org.springframework.boot.loader.PropertiesLauncher,可以接收命令行里的start-class参数(当然也可以接受其他参数),实现多main函数的需求。具体请参考这里:

https://qbgbook.gitbooks.io/spring-boot-reference-guide-zh/content/X.%20Appendices/D.4.%20PropertiesLauncher%20Features.html

https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html

下面是我的pom.xml配置:

		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>utf-8</encoding>
				</configuration>
			</plugin>

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<configuration>
					<archive>
						<manifest>
							<mainClass>org.springframework.boot.loader.PropertiesLauncher</mainClass>
						</manifest>
					</archive>
				</configuration>
			</plugin>

			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<mainClass>${start-class}</mainClass>
					<layout>ZIP</layout>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
			</plugin>

		</plugins>

下面是启动某个main函数的命令,参数-Dloader.main是关键:

java -jar -Dloader.main=com.xxxxx.xxxx.agent.CleanDatabaseApp ip_agent.jar --spring.config.location=application-prod.yml
此条目发表在IT分类目录,贴了, , , 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。

*