NoClassDefFoundError.如何设置依赖项并部署java应用程序



我的Java应用程序需要org.objectweb.asm库。我在pom中指定了"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。该应用程序需要球衣1.1.4,球衣需要asm 3.1。我认为玻璃鱼2.1.1 需要1.1.4版本

如果我运行Glassfish更新工具并在服务器上安装Jersey,那么我的应用程序加载并运行时不会出现问题。我的客户端的服务器上没有安装Jersey,他们不能使用更新工具。

Glassfish 2.1.1更新工具在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更新工具将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>

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

glassfish/lib/jersey-bundle-1.0.3.1.jar

它被加载并使用,而不是放在应用程序本地文件夹中的罐子:

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"));

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

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

在你的pom:中尝试这样的东西

  <dependency>
    <groupId>asm</groupId>
    <artifactId>asm</artifactId>
    <version>3.3.1</version>
  </dependency>

相关内容

  • 没有找到相关文章

最新更新