如何将自定义类与Spring Boot loader一起打包?

时间:2018-02-13 14:32:37

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

我正在使用spring boot maven插件,它为我创建了一个带有依赖关系的jar。问题是,我需要从Windows服务开始,WinSW需要一个启动类。所有依赖都隐藏在BOOT-INF/libBOOT-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.*!所以这使它变得更加复杂:(

2 个答案:

答案 0 :(得分:0)

Gradle

Spring Boot Gradle插件直接提供了向JAR中添加资源的功能:

bootJar {
with copySpec {
    from "$buildDir/classes/java/main/com/mejmo/ServiceHelper.class"
    into 'com/mejmo'
    }
}

Maven

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>