Difference/Equality of com.sun.faces > jsf-impl and org.glassfish > javax.faces (2.2.4)
在我的JSF2应用程序中,我遇到了Primefaces(5.1)自动完成中的NPE
org.primefaces.component.autocomplete.AutoCompleteRenderer
.encodeSuggestionsAsList(AutoCompleteRenderer.java:492)
我已经通过替换Maven依赖关系解决了我的问题
1 2 3 4 5
| <dependency>
<groupId>com.sun.faces</groupId>
jsf-impl</artifactId>
<version>2.2.4</version>
</dependency> |
通过
1 2 3 4 5
| <dependency>
<groupId>org.glassfish</groupId>
javax.faces</artifactId>
<version>2.2.4</version>
</dependency> |
这让我感到困惑。
在搜索项目主页时,我找到了以下Maven存储库:
http://mvnrepository.com/artifact/com.sun.faces/jsf-impl/2.2.4
http://mvnrepository.com/artifact/org.glassfish/javax.faces/2.2.4
他们都声明与首页相同的描述并引用相同的URL:
说明:Oracle对JSF 2.2规范的实现(2.2.4)
主页:http://java.sun.com/javaee/javaserverfaces/
有人可以解释差异吗? 难道不应该完全一样吗?
提示:我了解sun和Oracle的历史。 ;)
com.sun.faces:jsf-impl仅包含实现(Mojarra)。 它缺少API。你需要一个com.sun.faces:jsf-api一起吧。
org.glassfish:javax.faces是包含API和impl的单JAR捆绑包(您也可以按文件大小查看它)。
至于仅使用jsf-impl时的具体问题,显然您忘记了jsf-api,或者您在实际上使用像Tomcat这样的非Java EE容器时依赖了javax:javaee-web-api。
-
我正在使用tomcat 8.0.15和JDK 1.8.0_25。 jsf-api是依赖所有的时间的一部分。但是我不知道org.glassfish:javax.faces是一个捆绑包。现在,我将删除JSF API。但是该应用程序除了自动完成部分之外还在运行,并且实现方式是否应该完全相同?
-
但是javax:javaee-api 7.0是我的依赖项的一部分。
-
Tomcat不是Java EE容器。它是准系统的JSP / Servlet容器。如果要Java EE容器,请使用TomEE或WildFly。
-
在我的项目(和tomcat)中,似乎是javax:javaee-api,com.sun.faces:jsf-api和com.sun.faces:jsf-impl的非常具体的组合,那是行不通的。使用这些依赖项,自动完成功能会在AutoCompleteRenderer.java:492中抛出NPE。完全没有javaee-api的情况下,我可以使用jsf-api / jsf-impl或org.glassfish:javax.faces。
-
确实。 javaee-web-api不包含代码属性,它仅包含类/方法签名。这通常是已经由Java EE容器提供。然而Tomcat的心不是这样的一个。你几乎需要提供实际的API,如jsf-api单独地。作为回答:)
-
@BalusC我的问题是,为什么我应该同时使用org.glassfish:javax.faces jar而不是同时使用com.sun.faces:jsf-api和com.sun.faces:jsf-impl jar?是那里有什么区别?
-
@MahmoudSaleh:如果版本相同,则没有差异。但是自Mojarra 2.3.x起,分离的api / impl JAR不再可用。所以,你会如果youre只能用API / IMPL是过时。