定义字段时出现java.lang.NoSuchFieldError异常

时间:2011-11-18 13:33:55

标签: eclipse java-ee tomcat servlets eclipse-wtp

我正在为Apache Tomcat开发Web应用程序。 我正在使用一个名为Location的类,我在其中定义了一个名为ipAddresses的字段。这是:

package com.maxmind.geoip;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

public class Location {
private final static double EARTH_DIAMETER = 2 * 6378.2;
private final static double PI = 3.14159265;
private final static double RAD_CONVERT = PI / 180;

public Set<String> ipAddresses;
public String countryCode;
public String countryName;
public String region;
public String city;
public String postalCode;
public float latitude;
public float longitude;
public int dma_code;
public int area_code;
public int metro_code;

public Location() {
    ipAddresses = new HashSet<String>();
}
...
}

但是,在将webapp部署到服务器(war文件)并尝试运行其中使用此类的servlet之后,我得到了 java.lang.NoSuchFieldError 的异常 ipAddresses

此外,在尝试调试它(Eclipse)时,当我到达位置loc = new Location()的地方时,会发生两件奇怪的事情:

  1. 我没有调用我编码的构造函数,调试器不会进入它,而是在Location.java文件的导入中显示程序计数器箭头。
  2. 位置loc = new Location()调用“返回”后,当我查看对象的内容时,该字段实际上不存在。
  3. 使用jar文件部署的源文件包含此字段。
  4. 我尝试了很多东西:

    • 清理和构建项目并重新部署。
    • 清理服务器的工作目录,包括手动和使用Eclipse。
    • 在Eclipse中更改服务器的工作目录。
    • 在Eclipse中重新安装服务器。
    • 完全重新安装Tomcat,三次并安装到不同的位置!

    我很困惑。它可能是什么?

2 个答案:

答案 0 :(得分:3)

症状表明您在com.maxmind.geoip.LocationJRE/lib中的某些JAR中具有JRE/lib/ext类,或者在任何其他与Eclipse / Tomcat无关的类路径位置中具有loc.getClass().getProtectionDomain().getCodeSource().getLocation()类,该类始终优先于类加载WAR的课程。

在构建{{1}}之后对其进行检查时,应该可以深入了解实际的加载位置。

答案 1 :(得分:0)

你在使用这个领域吗?有什么参考吗? Eclipse完全有可能对其进行优化。

Windows->Preferences->Java->Compiler中,有一个设置:Preserve unused (never read) local variables。这是检查?如果没有,请检查并重试。