是否可以将自定义元数据添加到.class文件中?

Ton*_*ada 6 java debugging bytecode

我们已经在我们公司使用liquibase一段时间了,我们已经为数据库迁移设置了持续集成环境,这会在修补程序出错时破坏工作.

该CI环境的一个有趣的"特性"是破坏有"可能的罪魁祸首",因为所有补丁都需要有"作者",错误消息显示作者姓名.

如果你不知道liquibase是什么,那没关系,这不是重点.

问题的关键是:具有连接到一个错误的名字才是真的好软件开发proccess:问题得到更快的方式解决.

所以我在想:Java堆栈跟踪是否可行?

我们可能有一个带有人名的堆栈跟踪以及下面的行号吗?

java.lang.NullPointerException
 at org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372:john)
 at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121:mike)
 at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232:bob)
 at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173:bob)
 at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87:bob)
 at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862:john)
Run Code Online (Sandbox Code Playgroud)

必须从SCM系统中提取这种信息(比如对每个源文件执行"svn blame").

现在,忘记将编译时间浪费一分钟:这有可能吗?要向这样的类文件添加元数据?

Eug*_*hov 1

通常这种功能可以在版本控制系统之上实现。您需要知道版本控制系统中文件的修订版本,然后您可以调用blame/annotate命令来获取有关谁更改了每一行的信息。您不需要将此信息存储到类文件中,只要您可以识别您部署的每个类的修订版本(例如,您只部署某些标记或标签)。

如果您不想在调查堆栈跟踪时进入版本控制,您可以将行注释信息存储到类文件中,例如在构建期间使用类后处理器,可以在类级别添加自定义注释(这是相对的)使用ASM实现很简单)。然后打印堆栈跟踪的记录器可以在运行时读取此注释,类似于显示 jar 版本