java - 使用 Proguard 将 Guava 嵌入到另一个 jar 中

标签 java classloader proguard

我有一台 Tomcat 6 服务器,它托管一个 portlet 容器(在一个 war 中)和几个 portlet(每个 portlet 都打包在自己的 war 中)。我们需要在这些 Portlet 之间共享数据,并且由于我们使用的 Portlet 容器的版本,我们能看到的唯一方法是将包含我们逻辑的 jar 放入认可文件夹中,以确保不同的 war 看到相同的实例(每个 war 都有自己的类加载器)。

这个 jar 使用了 Google Guava 的各种缓存功能,并且已被证明可以在单元测试和 portlet 容器中工作。然而,我们发现自己面临着 Guava 不同版本的冲突,因为认可的类加载器优先于后续的类加载器。 portlet 容器使用早期版本的 Guava,而我们的 portlet 使用我们的内部框架,该框架使用更新版本!

  • 如果我们编写认可的 jar 来使用与 portlet 容器相同版本的 Guava,那么框架会启动,但 portlet 不会启动,因为 API 不同。
  • 如果我们编写认可的 jar 来使用与我们自己的框架相同版本的 Guava,那么 portlet 框架将不会启动,因为 API 不同,因此我们的 portlet 永远不会加载。

我们目前正在尝试的方法是将 Guava 源代码复制到新包下的我们自己的 jar 中 - 这已经在各种开源项目中完成 - 例如类 com.google.common.base.Ascii 将被重新打包 com.mycompany.com.google.common.base.Ascii。这是可行的,尽管这意味着每次我们制作新版本的认可 jar 时都需要重新编译 Guava。

我们更希望能够自动生成这个认可的 jar,并且看到了在 Android 环境中使用 ProGuard 和 Guava 的文档,感觉 Proguard 可能会提供帮助。

ProGuard 是否能够将 jar 依赖项重新打包到另一个 jar 中,从而维护单个内部包层次结构? -flattenpackagehierarchy 选项可以做到这一点吗?

最佳答案

另一个选择是使用 JarJar重新打包 Guava,这样您就不必每次都从源代码重新编译它。

关于java - 使用 Proguard 将 Guava 嵌入到另一个 jar 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25286219/

相关文章:

java - 如何标记一些必须在生产前删除的代码?

java - 获取数组的长度

java - 从应用程序类路径加载配置文件

android - 如何为javascript接口(interface)配置proguard?

gradle - 用 gradle 混淆生成的 fat jar

java - 正则表达式匹配中的意外结果

java - 使用 Angular 和 Spring Boot 的 IntelliJ IDEA 项目

java - 在应用程序 javaee5 中加载共享类

jpa - 可执行 JAR 中的 eclipselink PersistenceUnitLoadingEception

Android Proguard ExceptionInInitializerError 和 RuntimeException