6

我们在公司使用 liquibase 已经有一段时间了,我们已经为数据库迁移设置了一个持续集成环境,当补丁出现错误时,它会破坏工作。

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

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

关键是:在错误后面加上人名对软件开发过程非常有好处:问题得到解决的速度更快

所以我在想: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)

这种信息必须从 SCM 系统中提取出来(比如对每个源文件执行“svn blame”)。

现在,暂时忘记浪费编译时间:这可能吗?像这样将元数据添加到类文件中?

4

4 回答 4

3

原则上,您可以将自定义信息添加到 .class 文件(您可以在其中添加内容的属性部分)。为此,您必须编写自己的编译器/编译器扩展。无法在源代码中添加一些内容,然后这些内容将显示在类文件中。你在实践中也会遇到大问题:

  1. 堆栈跟踪构建/打印的方式不知道您添加到类文件中的任何内容。所以如果你想像上面展示的那样打印这些东西,你必须破解一些核心 JDK 类。
  2. 你想要多少细节?最后一个对给定文件进行任何更改的人?这在实践中不够精确,除非文件由单个开发人员拥有。
  3. 以更精细的粒度添加“last-committed-by”信息,比如每个方法,或者更糟糕的是,每行会迅速膨胀你的类文件(并且类文件的大小限制为 64K)

作为旁注,将错误归咎于人们是否有助于更快地修复错误在很大程度上取决于开发组织的文化。在你花费大量时间开发类似的东西之前,请确保你在一个有帮助的地方工作。

于 2012-05-22T21:28:28.547 回答
1

一种使用源代码中的注释将自定义信息添加到类文件的方法。我不知道如何将这些信息可靠地放在堆栈跟踪中,但您可以创建一个工具来检索它。

于 2012-05-22T21:30:25.300 回答
1

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

If you don't want to go into the version control when investigating stack trace, you could store line annotation info into the class file, e.g. using class post processor during your build that can add a custom annotation at the class level (this is relatively trivial to implement using ASM). Then logger that prints stack trace could read this annotation at runtime, similarly to showing jar versions.

于 2012-05-23T15:00:51.683 回答
0

正如@theglauber 正确指出的那样,您可以使用注释来添加自定义元数据。尽管我不确定您是否无法从实现 bean 的数据库中检索该信息并装饰您的自定义异常管理器。

于 2012-05-22T21:38:17.103 回答