Java 为什么Jersey 1.x与Jersey 2.x冲突?

Java 为什么Jersey 1.x与Jersey 2.x冲突?,java,jakarta-ee,jersey,glassfish,Java,Jakarta Ee,Jersey,Glassfish,我一直在阅读各种使用Jersey HTTP客户端包的Java库,我应该小心,因为它们使用Jersey 2.x,如果我的类路径中已经有Jersey 1.x,可能会导致一些冲突 但是,Jersey项目在并入Glassfish项目时更改了组id和包名称,从版本2.x开始 由于包名称不同,会有什么冲突?如果我的可部署应用程序中有Jersey 1.x,那么将使用这些类,因为Glassfish运行时提供的Jersey 2.x是完全不同的类,具有不同的名称 同样,如果我的可部署应用程序中有Jersey 1.x

我一直在阅读各种使用Jersey HTTP客户端包的Java库,我应该小心,因为它们使用Jersey 2.x,如果我的类路径中已经有Jersey 1.x,可能会导致一些冲突

但是,Jersey项目在并入Glassfish项目时更改了组id和包名称,从版本2.x开始

由于包名称不同,会有什么冲突?如果我的可部署应用程序中有Jersey 1.x,那么将使用这些类,因为Glassfish运行时提供的Jersey 2.x是完全不同的类,具有不同的名称

同样,如果我的可部署应用程序中有Jersey 1.x,并且出现了一些依赖项并添加了Jersey 2.x,那么我可能遇到的唯一问题是:如果没有部署描述符,Glassfish将使用它的库版本,而不是提供的版本。但在任何情况下,都不会出现问题,因为我的类路径中同时有Jersey 1.x和2.x,对吗

请告诉我,我遗漏了什么吗?有什么大惊小怪的

是的,你应该

当您的项目与您无法控制的依赖项相关联时,请始终三思

一个是您提到的从1.x到2.x,他们已经从
sun
名称空间移动到
glassfish
名称空间

在1.x中,他们使用JEE6版本的JAX-RS,在2.x中,他们使用JEE7版本的JAX-RS。这是一件大事。例如,泽西岛不同版本中使用的
javax.ws.rs.core.Application
是不同的,不能以相同的方式使用

Jesey 2.x使用JEE 7。在JEE7版本的
javax.ws.rs.core.Application

  • getClasses()
  • getSingleton()
  • getProperties()
    方法定义
Jesey 1.x使用JEE 6。在JEE6版本的
javax.ws.rs.core.Application
中,只有

  • getClasses()
  • getClass()
但是未定义
getProperties()
。 这可能导致错误,如
NoSuchMethodError
这只是一种无能。我相信如果你挖得更深,你会发现更多


不仅仅是名称空间,底层实现也改变了日志。是的,glassfish运行时加载了jersey。但是您可能会遇到麻烦,因为尽管指定了提供了作用域,但不同的工件名称可能会导致不一致。

假设版本2中的类x在版本1中有相同方法的改进版本。。。编译器究竟是如何知道您想要使用哪一个的?它们的路径是一样的,它们的类名和签名也是一样的哦,不,很明显Jersey在2.x中完全改变了包名,对吗?至少,这是我研究后发现的。所以,什么冲突,它们是不同的类。总是如果你加载同一个包的不同版本,你就有冲突的风险。它们实际上是完全不同的包,你没有读过我写的吗?不同的maven GroupID,不同的包:Jersey 1.x com.sun.Jersey,带有基本包com\sun\Jersey;Jersey 2.x org.glassfish,带有基本包org\glassfish。你要么是在耍聪明,不说出你真正的意思,要么就是不知道Java类加载器是如何工作的。Jersey 2.x将使用JAX-RS 2,而Jersey 1.x将使用JAX-RS 1。一些API已从JAX-RS 1更改为JAX-RS 2,您将面临的大多数问题是由于类差异(例如javax.ws.RS.core.Application)和JAX-RS 2类试图使用不在JAX-RS 1版本中的方法而导致的NoSuchMethodErrors和AbstractMethodErrors。这些就是你将面临的问题。例如