android switch 未定义,java – switch使用未定义的内部类在tomcat中导致NoClassDefFoundError...

我有一个非常简单的枚举

my.package.data.util

public enum Mode

{

SQLEXPORT, PREVIEW, PRINT

}

应该使用哪个在另一个类中使用枚举

my.package.program.ComponentController

switch (_mode) { // line 278, _mode is of type my.package.data.util.Mode

case PREVIEW:

// Do thing for preview

break;

case SQLEXPORT:

// Do thing for SQL

break;

case PRINT:

// Do thing for print

break;

default:

throw new IllegalArgumentException();

}

这两个类在同一个项目中,并编译成一个jar文件.

然后,Web项目使用此库(放入WEB-INF / lib文件夹).但是,当需要使用这个库,特别是那个开关时,会发生NoClassDefFoundError:

NoClassDefFoundError: my/package/program/ComponentController$1

at my.package.program.ComponentController.doCall(ComponentController.java:278)

这是我在几个层面上无法理解的:

>为什么Java尝试加载内部类(由$1可见). ComponentController中没有内部类,从来没有.

>为什么Java认为交换机使用这个内部类作为其参数

> my.package.data.util.Mode类消失了

这里发生了什么?

更多信息不在原始问题中

> ComponentController扩展了另一个类SessionBuilder.这个类也没有内部类

我使用javap反编译ComponentController并尝试在结果字节代码中找到有趣的东西.

看来字节码中确实有一个内部类:

public class my.package.program.ComponentController extends my.other.package.SessionBuilder

SourceFile: "ComponentController.java"

InnerClasses:

static #192 of #2; //class my/package/program/ComponentController$1 of class my/package/program/ComponentController

每当引用my.package.data.util.Mode时都会使用此类:

#192 = Class #486 // my/package/program/ComponentController$1

#193 = Utf8

#194 = Utf8 InnerClasses

#195 = Utf8 _mode

#196 = Utf8 Lmy/package/data/util/Mode;

而且,当切换实际发生时:

183: getstatic #102 // Field my/package/program/ComponentController$1.$SwitchMap$my$package$data$util$Mode:[I

186: aload_0

187: getfield #5 // Field _mode:Lmy/package/data/util/Mode;

190: invokevirtual #103 // Method my/package/data/util/Mode.ordinal:()I

193: iaload

194: tableswitch { // 1 to 3

1: 220

2: 335

3: 440

default: 516

}

对Rich链接的问题的进一步调查产生了一些有趣的东西:来自库项目的构建的jar在本地tomcat安装和用于为生产服务器生成jar的那个上有所不同:

左:WEB-INF / lib中的jar通过eclipse的本地tomcat,右:jar由ANT构建

现在看来,当发布到本地tomcat时eclipse使用的构建过程与ANT的做法不同(这是AFAIK只是一个简单的javac调用)

好吧,现在我只是将ANT创建的jar复制到本地tomcats WEB-INF / lib中,一切正常.当然,这意味着在库项目中的每次更改之后,我都必须手动将新jar复制到我的tomcat lib.

我在eclipse上将其作为错误报告提交,并将报告任何新闻.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值