【问题标题】:Solving "loader constraints violated when linking [...] class" error in Java解决 Java 中的“链接 [...] 类时违反加载器约束”错误
【发布时间】:2009-12-03 14:36:08
【问题描述】:

我是 Java 新手,在理解框架抛出的异常时遇到问题。

现在,我正在尝试在一个应用程序中实现一个正则表达式验证器,该应用程序由 Java 5 EE 和 myFaces 1.2 和 Tobago 在 apache tomcat 5.5 中运行。

我学习了一些教程(包括来自 SUN 的 Java 5 EE tut)并取得了相当大的进展。但是,在调用我的 jsp 时,我收到以下错误消息:

java.lang.LinkageError: loader constraints violated when linking javax/faces/validator/Validator class

谁能向我解释我需要做些什么来解决这个问题?

到目前为止,MyFaces 1.1.7 似乎与 TomCat 5.5 存在版本冲突。两者都包含 javax.* 包(其中之一是 javax.faces.validator)。验证器类在包中有不同的版本。对应的 MyFaces 库称为 myfaces-api-1.1.7.jar,TomCat 库称为 javaee.jar。

myfaces 库中包含的 javax 包是 javaee 库中的包的子集。但是......我不能跳过任何一个,因为项目将无法启动。

有什么提示吗?

【问题讨论】:

    标签: java validation myfaces


    【解决方案1】:

    这几乎可以肯定是由于您的应用程序拥有自己的Validator 副本(在它的一个 JAR 文件中),这与服务器自己的副本发生冲突。这可能会导致LinkageError

    找出您的 WAR 或 EAR 的哪个 JAR 文件包含该文件,并将其删除(连同其余的 javax.faces 类)。

    【讨论】:

    • 我相信我找到了异常的根源,但是我不知道如何解决这个问题。在 Eclipse 中的库下,我可以看到带有库 javaee.jar 的 Apache Tomcat v5.5,其中包含许多 javax 包,包括 javax.faces.validator 包。此外,我可以看到带有库 myfaces-api-1.1.7.jar 的 JSF MyFaces 1.1,其中包含几个 javax 包,还包括 javax.faces.validator 包。我该如何解决这个问题,因为我相信我需要这两个库并且不能在不破坏我的项目的情况下删除一个?
    • 如果 Tomcat 将 javax.faces 作为其库的一部分,那么它还应该包含完整的实现,并且您的应用程序根本不需要 myfaces-api-1.1.7.jar跨度>
    • 在 webapp 启动时删除 myfaces-api-1.1.7.jar 会立即导致 UnsupportedOperationException:java.lang.UnsupportedOperationException / javax.faces.context.FacesContext.getELContext(FacesContext.java:137 )
    • 嗯,好吧,看起来 Tomcat 中的 JSF 与您的应用程序中的 JSF 版本不同。您可能需要重新打包 myfaces-api-1.1.7.jar,删除 jabax 类,但保留其他所有内容。
    【解决方案2】:

    听起来像是类路径问题。检查您的类路径中是否有两个版本冲突的 jar(均包含 javax.faces.validator.Validator 类)


    根据 MyFaces 主页。 Tomcat Config: Tomcat 5.5.x

    一些用户报告了以下问题 在 Tomcat 5.5.x 中使用 MyFaces。这里 是一个简短的指南,希望 帮助你不会遇到同样的事情 问题:-)

    如果您使用的是二进制版本 MyFaces:MyFaces 是这样打包的 它适用于 Tomcat 5.0.x 所以 WEB-INF/lib/jsp-2.0.jarWEB-INF/lib/commons-el.jar JAR 文件必须从您的 WAR 文件(包括示例)。

    如果您是从源代码构建:如果 你想从头开始构建 MyFaces 要使用 Tomcat 5.5.x,您必须 设置属性 tomcat.pre.5.5.version 中的 $MYFACES_HOME/build/build.default.properties 文件设置为 false。

    【讨论】:

    • 正如 skaffman 的回复中所评论的,我找到了这些罐子:javaee.jar 和 myfaces-api-1.1.7.jar。我只是不知道如何解决这个冲突,因为我需要两者......
    • 检查扩展答案也许这适用于你
    • 在 WEB-INF/lib 下我没有 jsp-2.0.jar 也没有 commons-el.jar。但是,我有另一个目录,其中包含我的项目中包含的库。 MyFaces 目录包含一个 commons-el.jar 文件,但没有 jsp-2.0.jar 文件。包含的 TomCat 库包含一个 jsp-api.jar。但是,我不明白的是,commons 和 jsp 都不包含任何 javax.faces.validator 包。
    【解决方案3】:

    也许您的类路径中有同一个库的两个相互冲突的版本。例如,您可能在 WEB-INF/lib 中有一个 jar 文件,该文件已在 TOMCAT_HOME/lib 中提供。 (el-api.jar 是常见的罪魁祸首,但还有其他可能。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 2013-07-26
      • 2018-07-17
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多