我正在使用spring boot maven插件,它为我创建了一个带有依赖关系的jar。问题是,我需要从Windows服务开始,WinSW需要一个启动类。所有依赖都隐藏在BOOT-INF/lib
和BOOT-INF/classes
中的类中。
my-boot.jar
\
\BOOT-INF
\BOOT-INF\lib (jar dependencies)
\BOOT-INF\classes (compiled output)
\org\springframework... (Spring boot loader)
\com\mejmo\ServiceHelper.class <- here should be my class
我需要一些方法在类路径级别(在jar的根目录中添加我的类,以及org.springframework.loader.*
,它是Spring Boot应用程序的引导序列+类加载器)。该服务不能直接调用spring boot loader,而是在我的类的帮助下处理启动/停止命令。
我正在使用https://github.com/snicoll-scratches/spring-boot-daemon,但它将所有依赖项复制到lib/
,以便Windows服务可以加载包括自定义类的jar。问题是所有的家属都在罐子里。
有没有办法如何在jar中的引导序列级别打包我的自定义类?我想单独使用maven,没有任何手动复制,应该在CI中自动创建。
spring boot maven插件中的自定义布局参数可以提供帮助吗?
更新:我发现我的ServiceHelper课程也需要org.springframework.boot.*
!所以这使它变得更加复杂:(
答案 0 :(得分:0)
Spring Boot Gradle插件直接提供了向JAR中添加资源的功能:
bootJar {
with copySpec {
from "$buildDir/classes/java/main/com/mejmo/ServiceHelper.class"
into 'com/mejmo'
}
}
Spring Boot Maven插件不直接支持此功能。但是Ant的Zip Task可用于更新JAR:
这里是提取项目依赖项并将其添加到JAR根目录中的示例。但是,可以使用文档中所述的每个zipfileset
:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>addExtractedJarOnRootLevel</id>
<phase>package</phase>
<configuration>
<target>
<zip destfile="${project.build.directory}/${project.artifactId}-${project.version}.jar"
update="yes" compress="false">
<zipfileset src="${GROUP_ID:ARTIFACT_ID:jar}" />
</zip>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
Spring Boot Maven插件也绑定到Mavens package
阶段。因此,maven-antrun-plugin
必须在pom.xml中的spring-boot-maven-plugin
下方。
如果JAR文件是可执行的JAR文件,则无法更新:spring-boot-maven-plugin
必须配置为<executable>false</executable>
,以便在JAR前面不添加embeddedLaunchScript
。 / p>
答案 1 :(得分:0)
是的,必须使用maven-antrun-plugin作为将外部jar文件提取到输出jar文件的根级别的解决方案。
<properties>
<pcanbasicdir>D:/libs/JAVA/pcanbasic</pcanbasicdir>
<pcanbasicjar>pcanbasic.jar</pcanbasicjar>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--
<includeSystemScope>true</includeSystemScope>
-->
</configuration>
</plugin>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<id>unpack-jar-features</id>
<phase>install</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<echo message="unpack jar file : ${pcanbasicdir}/${pcanbasicjar}" />
<mkdir dir="${project.build.directory}/pcanbasic"/>
<unzip dest="${project.build.directory}/pcanbasic">
<fileset dir="${pcanbasicdir}/">
<include name="${pcanbasicjar}" />
</fileset>
</unzip>
</target>
</configuration>
</execution>
<execution>
<id>addExtractedJarOnRootLevel</id>
<phase>install</phase>
<configuration>
<target>
<zip destfile="${project.build.directory}/${project.artifactId}-${project.version}.jar"
update="yes" compress="false">
<zipfileset src="${pcanbasicdir}/${pcanbasicjar}" />
</zip>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>