运行可执行JAR时读取外部类的注解丢失如何解决
问题根因
- 注解保留策略配置错误:如果你的
@Id、@NotNull注解的保留策略设置为SOURCE或者CLASS级别,编译为class文件后注解会被擦除,仅IDE调试阶段的中间产物可能临时保留注解信息,所以会出现调试正常、打包后运行失效的情况。 - 类路径加载优先级问题:你把
Car.class单独放在了JAR包外的目录,使用java -jar命令运行时默认只会加载JAR包内部的类,若JAR包内部存在无注解的Car.class副本,或者外部Car.class不在运行时类路径中,都会导致读取不到注解。 - 构建配置问题:如果打包时开启了字节码混淆、类裁剪等优化逻辑,也可能会把注解信息从class文件中移除。
解决方案
- 检查自定义注解的定义,加上运行时保留策略,示例如下:
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; // 每个自定义注解都要添加该配置 @Retention(RetentionPolicy.RUNTIME) public @interface Id { }
- 调整运行命令,指定包含外部
Car.class的目录到类路径中。注意-jar参数会默认忽略外部类路径配置,所以要修改命令为:
# Linux/Mac 环境 java -cp <application-name>.jar:./code com.example.base.myapp.Application # Windows 环境 java -cp <application-name>.jar;./code com.example.base.myapp.Application
命令末尾的全限定类名要替换成你自己的
Application主类的实际全路径
- 检查Maven/Gradle等构建工具的打包配置,关闭针对注解的字节码裁剪逻辑,若开启了混淆,需要把你的注解类和
Car类加入混淆排除列表。
内容的提问来源于stack exchange,提问作者Zhe Sheng Lim
相关产品推荐
相关产品推荐

