簡體   English   中英

Glassfish4服務器和jersey2:glassfish為什么要向應用程序提供自己的jersey2

[英]Glassfish4 server & jersey2: why does glassfish provide its own jersey2 to application

最近,我嘗試將Jersey2應用程序部署到Glassfish4.1。 我有很多依賴項問題,並且發現了很多ClassCastException。

后來我在這里找到了用戶指南: https : //jersey.java.net/documentation/latest/modules-and-dependencies.html#servlet-app-glassfish

我必須像這樣配置pom.xml:

<dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.0.1</version> <scope>provided</scope> </dependency>

<dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet</artifactId> <version>2.23.1</version> <scope>provided</scope> </dependency>

如果您使用的是Glassfish應用程序服務器,則無需在應用程序中打包任何內容,所有內容均已包含在內。 您只需要聲明(提供)對JAX-RS API的依賴關系就可以編譯您的應用程序。

我的問題是,為什么Glassfish必須自己提供jersey2(JSR實現)才能進行應用。 為什么不讓應用程序選擇它正在使用的JSR實現呢?

我還在WEB-INF下添加glassfish-web.xml

<glassfish-web-app> <class-loader delegate="false" /> </glassfish-web-app>

根據此處的文檔( https://docs.oracle.com/cd/E19798-01/821-1752/beagb/index.html ):

它會讓Glassfish首先在WEB-INF/lib/下加載類。 但是,為什么Glassfish仍然使用自己的球衣版本和javax版本?

對於Javax,我猜Glassfish是Java應用程序版本,它僅支持特定的JSR實現。 因此,當我在應用程序中選擇JSR實現時,我必須找出正確的Glassfish版本。

但是,為什么jersey2如此特別,以至於玻璃魚必須提供它。 如果我想使用另一個版本的jersey2,該怎么辦?


更新:

我進行了更多測試。

當我將jersey1應用程序(war1中包含jersey1)部署到glassfish4並要求glassfish4將類加載器進程委托給它的父級時,該應用程序開始工作,並且應用程序可以處理傳入的其余請求。 為什么? 我猜因為glassfish不包含jersey1,它將從war文件中的庫中加載jersey1,而glassfish4實際上正在使用jersey1。 這是否意味着我可以重寫glassfish的默認行為,以使應用程序選擇JAX-RS實現。

如果我用jersey2替換jersey1,但仍然讓glassfish4首先從war加載庫,則會引發異常:

WebModule[/invoiceLoader]StandardWrapper.Throwable java.lang.ClassCastException: Cannot cast org.glassfish.jersey.gf.cdi.internal.CdiComponentProvider to org.glassfish.jersey.server.spi.ComponentProvider at java.lang.Class.cast(Class.java:3369) at org.glassfish.jersey.internal.ServiceFinder$LazyObjectIterator.hasNext(ServiceFinder.java:713) at org.glassfish.jersey.server.ApplicationHandler.getRankedComponentProviders(ApplicationHandler.java:743) at org.glassfish.jersey.server.ApplicationHandler.access$600(ApplicationHandler.java:184) at org.glassfish.jersey.server.ApplicationHandler$4.get(ApplicationHandler.java:406) at org.glassfish.jersey.server.ApplicationHandler$4.get(ApplicationHandler.java:399) at org.glassfish.jersey.internal.util.collection.Values$LazyValueImpl.get(Values.java:340) at org.glassfish.jersey.server.ApplicationHandler.createApplication(ApplicationHandler.java:366) at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:342) at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:392) at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177)

異常是如何發生的?

我的問題是,為什么Glassfish必須自己提供jersey2(JSR實現)才能進行應用。 為什么不讓應用程序選擇它正在使用的JSR實現呢?

因為Glassfish是Java EE兼容服務器,而JAX-RS是EE規范的一部分。 因此,它需要JAX-RS的實現才能運行JAX-RS應用程序。 恰好是使用Jersey作為實現,就像JBoss使用RESTEasy一樣。 如果服務器沒有實現,那么它將不符合EE。 應用程序應僅能夠針對單個EE jar編譯應用程序,才能運行完整的EE應用程序。 它不需要了解任何實現。

如果我想使用另一個版本的jersey2,該怎么辦?

您可以嘗試用新的替換所有Jersey實施jar。 請參閱在GlassFish 4中更新球衣2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM