java:在一个Web应用程序中使用同一库的两个版本
我面临以下问题:我的 web 应用程序中有一个模块需要 jaxb 1.x,而另一个模块需要 jaxb 2.x。第一个模块不适用于新版本的 jaxb,反之亦然。如何在一个项目中使用这两个罐子? 谢谢。
I'm facing the following problem: I have one module in my webapp that needs jaxb 1.x and the other module needs jaxb 2.x. The first module doesn't work with the new version of jaxb, and the opposite. How can I use these two jars in one project?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
对于常规应用程序,通常不同的版本使用不同的包名称。如果是这种情况,您可以同时使用它们,没有问题。但是,如果它们相同,您可以使用 jarjar 重命名软件包。
但是,由于您使用的是 Web 容器,因此每个应用程序都应使用您部署的版本,而不是其他版本。也就是说,Web 容器会为您解决这个问题。
OSGi 是另一个容器,它可以更明确地管理版本,并让您更好地控制这些问题(但我相信您只是为此需要它)
For a regular application, usually very different versions use different package names. If this is the case, you can use them both at once without problem. However if they are the same, you can use jarjar to rename the package.
However since you are using a web container each application should use the version you deploy and not the other version. i.e. the web container works it out for you.
OSGi is another container which manages the versions much more explicitly and give you more control over these issues (however I believe you need it just for this)
你遇到了一个罐子地狱问题。一般来说在普通的java环境下是不可能解决这个问题的。您必须使用 OSGI 强制模块化到您的项目中。起点:http://www.osgi.org/About/HowOSGi
You have got a jar-hell issue. Generally speaking in normal java environment it's impossible to solve this problem. You have to force modularization into your project by using OSGI. Starting point: http://www.osgi.org/About/HowOSGi
如果您使用的是 JAXB 参考实现,则可以通过包含 jaxb1-impl.jar 将 JAXB 1 模型与 JAXB 2 运行时结合使用>。
If you are using the JAXB reference implementation, then you can use your JAXB 1 models with the JAXB 2 runtime by including the jaxb1-impl.jar.
正如萨满所说,这个问题是不可能解决的。
让我们看看:servlet 容器 JRE 只有一个类加载器,该类加载器可以加载和使用 jaxb 或另一个中的一个类,但不能同时加载和使用这两个类,否则会出现 classdefnotfound 异常或类似的情况。
你不能直接解决这个问题:
您可以获取代码(开源)并将其中一个的包更改为另一个名称,以便类加载器可以使用两者。我不推荐你这个解决方案,这是一个糟糕的解决方案。
更好的是您将代码迁移到使用最现代的 API (jaxb 2)
As Shaman said is imposible to resolve this issue.
Let's see: the servlet container JRE has only one classloader, and this classloader can load and use one class from jaxb or the other, but not both that will give you a classdefnotfound exception or something similar.
You can not solve this directly:
you can get the code (is opensource) and change the package of one to another name so the classloader can use both. I do not recommend you this solution, is a bad one.
Better is that you migrate the code to use the most modern API (jaxb 2)