2010-09-21 156 views
17

我遇到了一個項目有兩個相同的.jar(對於我的情況,el-api.jar v2.1)的問題,因此,當我嘗試使用Tomcat運行我的項目時出現以下錯誤堆棧6.加載程序約束違規

WARNING: Unexpected error forwarding to login page 
javax.servlet.ServletException: java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;" the class loader (instance of org/apache/jasper/servlet/JasperLoader) of the current class, org/apache/jsp/login_jsp, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ExpressionFactory used in the signature 

at java.lang.Thread.run(Thread.java:619) 
Caused by: java.lang.LinkageError: loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;" the class loader (instance of org/apache/jasper/servlet/JasperLoader) of the current class, org/apache/jsp/login_jsp, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, javax/servlet/jsp/JspApplicationContext, have different Class objects for the type javax/el/ExpressionFactory used in the signature 

我已經找到了 http://blog.springsource.com/2008/10/20/understanding-the-osgi-uses-directive/

,但不是作爲解決影響我的項目上太多的地方有用。

我無法對Tomcat進行任何更改以及該項目將被許多其他用戶使用。

當前的解決方法是每次我們構建並使用Tomcat6時,都要manuelly刪除el-api.jar。然後我們需要把.jar放回原來的名稱。

我使用Maven 2和Maven 3來構建。 (順便說一句,有沒有人知道在Jruby上使用Maven3?)

任何人都可以幫我解決這個問題嗎?

+0

對不起,爲了解決這個問題,我認爲它需要一種方法來確保Tomcat 6只接收一個el-api.jar而不是兩個。 約束將是: - \t沒有變化到Tomcat 6 - \t一個版本 - \t該解決方案可連續集成構建的答案 – Javabeginner 2010-09-21 15:35:46

回答

15

我遇到了一個項目有兩個相同的.jar(對於我的情況,el-api.jar v2.1)的問題,因此,當我嘗試使用Tomcat運行我的項目時出現以下錯誤堆棧6.

然後將el-api.jar工件標記爲provided,如果是的話。

目前的解決方法是在每次構建並使用Tomcat6時,手動刪除el-api.jar。然後我們需要把.jar放回原來的名稱。

一個更好的方式來處理,這將是宣佈內部配置文件的依賴,將其標記爲provided(例如,在「tomcat6中」配置文件)或不依賴於需求。

+0

謝謝,但不會因爲有我們的情況下工作兩個配置文件,我們需要兩個版本,我只想要一個。 – Javabeginner 2010-09-21 14:51:29

+0

@Javabeginner我不明白如何手動刪除/添加文件更好......你在找什麼*完全*?你的約束是什麼?你有什麼要求?添加細節通常有助於獲得與之匹配的答案。 – 2010-09-21 15:07:09

+0

對不起,爲了解決這個問題,我認爲它需要一種方法來確保Tomcat 6只拾取一個el-api.jar而不是它們兩個。 約束將是: - \t沒有變化到Tomcat 6 - \t一個版本 - \t該解決方案可連續集成構建 – Javabeginner 2010-09-21 15:35:29

6

我得到這個錯誤試圖運行春季(3.0.5)樣本MVC的Ajax和Tomcat 7

的Tomcat 7使用EL-API 2.2和JSP-API 2.2。 mvc-ajax pom文件指定了jsp-api 2.1,其中還包含el-api中的類。

爲了實現這個運行,我從pom中註釋掉了jsp-api 2.1。這允許Tomcat使用它自己的(更新的)版本。