Я заметил эту проблему при попытке загрузить MANIFEST.MF из файла .jar моего приложения через class.getResource("/META-INF/MANIFEST.MF")
.
Вместо того, чтобы получить мой собственный манифест, казалось бы, загружается манифест из /usr/share/java/java-atk-wrapper.jar
,Однако этот jar не указан как часть пути к классу моего приложения - я пытался отключить вспомогательные технологии Java ( здесь ), но это не дало никакого эффекта.
Интересно, что это специфическое поведениев OpenJDK-11.0.4. Эта проблема не возникает при использовании 11.0.3. Может ли кто-нибудь пролить свет на то, что здесь происходит? Были ли какие-то изменения в том, как java-внутренние файлы загружаются / доступны? Или это может быть просто ошибка, появившаяся в 11.0.4?
Минимальный рабочий пример:
import java.net.URL;
public class Main {
public static void main(String[] args) {
final URL resource = Main.class.getResource("/META-INF/MANIFEST.MF");
System.out.println(resource.getPath());
}
}
Затем запустите:
$ java --version
openjdk 11.0.4 2019-07-16
OpenJDK Runtime Environment (build 11.0.4+11-post-Ubuntu-116.04.1)
OpenJDK 64-Bit Server VM (build 11.0.4+11-post-Ubuntu-116.04.1, mixed mode, sharing)
$ javac Main.java
$ java Main
file:/usr/share/java/java-atk-wrapper.jar!/META-INF/MANIFEST.MF
$ echo $CLASSPATH
$
Поведение этого фрагмента кода expexted будет вызывать NPE, поскольку нет ресурса манифеста. Вместо этого манифест загружается из atk-wrapper.
Сведения об окружении:
Ubuntu 16.04.5 LTS
OpenJDK был недавно установлен через apt
add-apt-repository ppa:openjdk-r/ppa
apt install openjdk-11-jdk
apk-оболочка не установлена явно. Я не знал о его существовании до тех пор, пока эта проблема не возникла на одной из наших машин - и в этот момент я смог воспроизвести ее и на своей локальной машине.