基于spring-boot开发自定义jar包Notes

基于spring-boot开发自定义jar包Notes

前言

我使用的环境或配置如下:

语言 java 1.8
框架 spring-boot 2.3.12.RELEASE
打包工具 maven
IDE idea
远端maven库 Nexus私库

1. 一些坑

1.1. package(包)名称

务必使用类似于org.example.namepackage名称,并且尽量与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>

注意,distributionManagementrepository或者snapshotRepository配置的id需要和server下的id一致

之后,执行mvn clean deploy即可.