java - 从生成的二进制文件中去除 ScalaSignature 注释

标签 java scala sbt proguard sbt-assembly

如何以编程方式去除 javascala 注释?

我当前项目的可交付成果之一是我的代码,以及我的代码所依赖的任何依赖项,作为 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/

相关文章:

java - 切换到另一个 Activity 时出错,无法找到显式 Activity 类,您是否在 AndroidManifest 中声明了此 Activity

java - Tomcat 管理器中的 Web 应用程序版本

Java 国际化 - ISO ISO 3166-2(分割 - 例如省或州)或 UN/LOCODE - 库

scala - 如何在 scala 中自动重新运行 sbt 项目

java - 在 weblogic 12c 上运行的 REST 项目 (netbeans) 上,EntityManager 始终为 null

java - jersey2 单元测试,HttpServletRequest 为空

scala - Spark 单元测试失败,错误代码为 "ExceptionInInitializerError",最新版本为 "json4s-jackson"

java - 如何在 Java 中使用 Flinks Splitter 方法

scala - 从子模块访问主模板

scala - spark-core 依赖项中的冲突。它是如何工作的?