【发布时间】:2023-03-14 19:12:01
【问题描述】:
我有一个 Tomcat 6 服务器,它托管一个 portlet 容器(在战争中)和几个 portlet(每个都打包在自己的战争中)。我们需要在这些 portlet 之间共享数据,并且由于我们使用的 portlet 容器的版本,我们可以看到的唯一方法是将带有我们的逻辑的 jar 放入 endorsed 文件夹中,以确保不同的战争会看到相同的实例(每场战争都有自己的类加载器)。
这个 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 (code.google.com/p/jarjar) 重新打包 Guava,这样您就不必每次都从源代码重新编译?
-
@DanDyer 这对我来说看起来不错 - 如果你想发布答案,那么我会接受。
标签: java classloader proguard