1

我的 Java 应用程序需要 org.objectweb.asm 库。我在 pom.xml 中指定了“asm”依赖项。这会将库与应用程序一起部署。应用程序仍然抛出异常 NoClassDefFoundError: org/objectweb/asm/ClassVisitor。

java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor
    at com.sun.jersey.api.core.PackagesResourceConfig.init(PackagesResourceConfig.java:112)
    at com.sun.jersey.api.core.PackagesResourceConfig.<init>(PackagesResourceConfig.java:78)
... many more

我该如何解决这个问题?

详细信息:我使用的是 Glassfish 2.1.1。该应用程序需要 jersey 1.1.4,jersey 需要 asm 3.1。我假设 glassfish 2.1.1 需要 1.1.4 版本

如果我运行 Glassfish updatetool 并在服务器上安装 Jersey,那么我的应用程序加载并运行没有问题。我的客户没有在他们的服务器上安装 Jersey,他们不能使用 updatetool。

Glassfish 2.1.1 updatetool 在 glassfish/lib 目录中安装 jersey 1.1.4 和 asm-3.1.jar。当 jersey 被卸载时,updatetool 也会删除 asm。

如果我将 jersey 和 asm 作为依赖项并部署我的 war 文件,那么 jersey 和 asm jar 将进入本地位置,例如 glassfish/domains/domain1/applications/j2ee-modules/MYAPPNAME/WEB-INF/lib/asm-3.1.jar。

Glassfish updatetool 将 asm 放入 lib 文件夹: glassfish/lib 目录,应用程序开始部署并正常工作。

这是我的 maven pom 文件依赖部分:

<dependencies>
    <dependency>
        <groupId>asm</groupId>
        <artifactId>asm</artifactId>
        <version>3.1</version>
    </dependency>

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-bundle</artifactId>
        <version>1.1.4</version>
    </dependency>

    <dependency>
        <groupId>com.sun.jersey.jersey-test-framework</groupId>
        <artifactId>jersey-test-framework-grizzly2</artifactId>
        <version>1.17.1</version>
                    <scope>test</scope>
    </dependency>
    <dependency>  
                <groupId>javax.persistence</groupId>  
                <artifactId>persistence-api</artifactId>  
                <version>1.0</version>  
        <scope>provided</scope>
            </dependency>  
    <dependency>
        <groupId>org.jboss.spec</groupId>
        <artifactId>jboss-javaee-6.0</artifactId>
        <version>1.0.0.Final</version>
        <scope>provided</scope>
        <type>pom</type>
    </dependency>
            <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>        
</dependencies>
4

2 回答 2

2

我与存储在 glassfish/lib 文件夹中的旧球衣库发生冲突:

glassfish/lib/jersey-bundle-1.0.3.1.jar

它被加载和使用,而不是放置在应用程序本地文件夹中的 jars:

glassfish/domains/domain1/applications/j2ee-modules/MYAPPNAME/WEB-INF/lib/

来自“lib”文件夹的 Jersey jar 正在同一个“lib”文件夹中寻找“asm”库,因此从未找到我本地放置的 asm-3.1.jar。

我希望首先加载“本地”罐子。似乎搜索顺序不同。真的是这样吗?如果我错了,请告诉我。

我通过验证与以下代码一起使用哪个库发现了问题:

logger.debug(PackagesResourceConfig.class.getResource("PackagesResourceConfig.class"));

注意PackagesResourceConfig类中列出的异常抛出。

希望这个答案能帮助其他人节省时间。

于 2013-08-22T06:18:46.360 回答
0

在你的 pom 中尝试类似的东西:

  <dependency>
    <groupId>asm</groupId>
    <artifactId>asm</artifactId>
    <version>3.3.1</version>
  </dependency>
于 2013-08-21T08:51:18.260 回答