You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行可执行JAR时读取外部类的注解丢失如何解决

问题根因
  1. 注解保留策略配置错误:如果你的@Id、@NotNull注解的保留策略设置为SOURCE或者CLASS级别,编译为class文件后注解会被擦除,仅IDE调试阶段的中间产物可能临时保留注解信息,所以会出现调试正常、打包后运行失效的情况。
  2. 类路径加载优先级问题:你把Car.class单独放在了JAR包外的目录,使用java -jar命令运行时默认只会加载JAR包内部的类,若JAR包内部存在无注解的Car.class副本,或者外部Car.class不在运行时类路径中,都会导致读取不到注解。
  3. 构建配置问题:如果打包时开启了字节码混淆、类裁剪等优化逻辑,也可能会把注解信息从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:39:03