基于spring-boot开发自定义jar包Notes
前言
我使用的环境或配置如下:
语言 | java | 1.8 |
---|---|---|
框架 | spring-boot | 2.3.12.RELEASE |
打包工具 | maven | |
IDE | idea | |
远端maven库 | Nexus私库 |
1. 一些坑
1.1. package
(包)名称
务必使用类似于org.example.name
的package
名称,并且尽量与pom.xml
文件中groupId
一致
1.2. 自动下载依赖包
如果会使用mvn install
,它会自动打包当前pom.xml
文件为.pom
文件,安装到本地库中;如果没使用或者不会使用mvn install
,则需要将工具包的pom.xml
复制一份,命名为xxx-x.x.x.pom
,并且放在本地maven仓库引用该包的对应路径下。
否则,不会自动下载工具包的依赖包。网上有很多教人将依赖包打入工具包中形成一个"大而全"的jar包的教程,想想这肯定是不正确的。
1.3. @Value
注入配置项
在构建工具包时,@Value
注解会使用工具包的application.yml
或.properties
文件。但将工具包引入到实际开发应用后,@Value
注解使用的application.yml
文件则是实际开发应用的而非工具包的。这是由于classpath
的改变。
我构建工具包时,明确需要@Value
注解使用被实际开发应用的配置文件。如果你希望使用工具包自带的application.yml
文件,或许有解决办法,例如增加classpath
或者使用@TestProperties
注解等等,**我没有尝试,无法给出准确答案。**实际上,我不推荐这样做,如果是一份写死的静态资源,我认为不需要使用@Value
注解。
@Value
注解则涉及null
的问题,务必加上默认值null
,因为这是一个工具包,不一定含有application.yml
配置文件。并且,在使用相关变量时,进行空校验处理。
1.4. 使用自定义jar包时,扫描不到@Service
由于自定义jar包基于spring-boot框架,那么在别的spring-boot应用里,可能没被指定包扫描路径。需要在启动项注解加上配置,如下所示:
@SpringBootApplication(scanBasePackages = {"org.example.xxx"})
如果实际开发应用和工具包的包名不同,那么还需要加上实际开发应用的包名称,否则,应用中的类会无法被扫描注入到spring容器中
1.5. 反编译导致变量名混淆、注释丢失
反编译导致变量名混淆和注释丢失无法避免,那么只能在maven打包时,增加添加打包源码的步骤,pom.xml配置如下:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
在使用idea查看.class文件时,则可以下载到source.jar文件
2. application.yml自动补全提示配置
在src/main/resources下新建META-INF目录,新建additional-spring-configuration-metadata.json
文件,相关配置和语法见Configuration Metadata
在pom.xml文件中新增依赖,如下所示:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
3. maven deploy到Nexus库步骤
在pom.xml文件中增加以下配置:
<distributionManagement>
<repository>
<id>Nexus-Releases</id>
<name>My Nexus</name>
<url>http://url:port/repository/releases/</url>
</repository>
</distributionManagement>
repository
为发行版仓库,发行版的版本后缀添加-RELEASE,或者直接是数字,deploy时会自动部署到发行版仓库。还有一类为snapshotRepository
快照版仓库,需要加-SNAPSHOT后缀。
在maven的配置文件中settings.xml下增加:
<servers>
<server>
<id>Nexus-Releases</id>
<username>admin</username>
<password>123456</password>
</server>
</servers>
注意,distributionManagement
下repository
或者snapshotRepository
配置的id
需要和server
下的id
一致
之后,执行mvn clean deploy
即可.