java.lang.NoSuchFieldError исключение, пока поле определено - PullRequest
1 голос
/ 18 ноября 2011

Я работаю над веб-приложением для Apache Tomcat.Я использую класс с именем 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>();
}
...
}

Однако после развертывания веб-приложения на сервере (файл war) и попытки запустить сервлет, использующий в нем этот класс, я получаю исключение java.lang.NoSuchFieldError для ipAddresses .

Более того, при попытке отладки (Eclipse), когда я добираюсь до места, где Location loc = new Location () *Вызывается 1011 *, происходят две странные вещи:

  1. Код, который я кодировал, не вызывается, отладчик не вступает в него, вместо этого отображается стрелка счетчика программы при импортев файле Location.java.
  2. После "возврата" из вызова Location loc = new Location () , когда я просматриваю содержимое объекта, поле фактически не существует.
  3. Исходный файл, который был развернут с помощью файла jar, включает это поле.

Я пробовал много вещей:

  • очистка и сборка проекта иповторное развертывание.
  • очистка работы сервераВ этом каталоге, как вручную, так и с помощью Eclipse.
  • изменяя рабочий каталог сервера, в Eclipse.
  • переустановка сервера в Eclipse.
  • переустановкаTomcat целиком, трижды и в разных местах!

Я застрял.Что бы это могло быть?

Ответы [ 2 ]

3 голосов
/ 18 ноября 2011

Симптомы указывают, что у вас есть класс com.maxmind.geoip.Location в каком-то JAR-файле в JRE/lib или JRE/lib/ext или в любом другом Eclipse / Tomcat-независимом расположении пути к классам, которое всегда будет иметь приоритет при загрузке классов над классами WAR.

Изучение loc.getClass().getProtectionDomain().getCodeSource().getLocation() после его создания должно дать представление о том, где он на самом деле был загружен из.

0 голосов
/ 18 ноября 2011

Вы используете поле вообще? Есть ли ссылки на это? Вполне возможно, что Eclipse оптимизирует его.

В Windows->Preferences->Java->Compiler есть настройка: Preserve unused (never read) local variables. Это проверено? Если нет, проверьте это и попробуйте снова.

...