如何以编程方式去除 java
或 scala
注释?
我当前项目的可交付成果之一是我的代码,以及我的代码所依赖的任何依赖项,作为 uber-jar。我们正在构建一个 SDK,因此需要重命名任何包含的依赖项,以免干扰 SDK 客户端的依赖项(这意味着如果我们使用 apache commons 版本 X,而他们使用版本 Y,则没有任何依赖项)冲突)。我们使用 sbt-assemble 来重命名我们的代码所依赖的包。例如 org.apache.* -> com.mycompany.org.apache.*
我们的项目主要是用 scala
编写的,我们使用 sbt
来构建。最近我确定着色会导致 ScalaSignature 注释出现问题。当在客户端项目中使用 uber-jar 时,这又会导致构建问题。
我确定删除 ScalaSignature
可以解决该问题。我使用 ProGuard 来做到这一点,但是该工具对于我们想要实现的目标来说太过分了。我只是好奇是否有人找到了可以删除指定注释的工具。或者更好的是,一个工具可以重命名包,同时以 scalac
满意的方式保留 ScalaSignature
。
最佳答案
您可能想要检查 JavaAssist 库,其中 clearly allows to get/add annotations dynamically .
接下来,理论上应该可以使用 AnnotationsAttribute
通过以下方式(我自己没有尝试过,但请告诉我们以下方法是否有效):
MethodInfo minfo = m.getMethodInfo();
AnnotationsAttribute attr = (AnnotationsAttribute)
minfo.getAttribute(AnnotationsAttribute.invisibleTag);
Annotation[] annotations = attr.getAnnotations();
// ...remove the unnecessary annotation from array...
attr.setAnnotations(annotations);
关于java - 从生成的二进制文件中去除 ScalaSignature 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34933006/