OpenJDK 11.0.4 имеет java-atk-wrapper.jar в пути к классам - PullRequest
0 голосов
/ 04 октября 2019

Я заметил эту проблему при попытке загрузить 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-оболочка не установлена ​​явно. Я не знал о его существовании до тех пор, пока эта проблема не возникла на одной из наших машин - и в этот момент я смог воспроизвести ее и на своей локальной машине.

1 Ответ

1 голос
/ 04 октября 2019

Когда я попытался воспроизвести это с помощью OpenJDK Java 11.0.4 на Fedora 29, я получил NPE.

$ javac Main.java 
$ java Main 
Exception in thread "main" java.lang.NullPointerException
    at Main.main(Main.java:6)
$ java -version
openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment 18.9 (build 11.0.4+11)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.4+11, mixed mode, sharing)
$ echo $CLASSPATH

$

Затем я попытался найти java-atk-wrapper.jar. Не там. Поэтому я установил его через менеджер пакетов, а затем снова запустил вашу программу.

Все еще NPE 1 .

Хммм.

Вывод: естьчто-то странное в установленной вами OpenJDK Java 11.0.4, но это НЕ ошибка в самом OpenJDK.

Обратите внимание, что следующий отчет об ошибке OpenJDK имеет отношение к этому:

Похоже, команда OpenJDK не поддерживает и не поддерживает содержимое этого JAR-файла.


UPDATE

Учитывая дополнительную информацию, которую вы добавили в вопрос, проблема может заключаться в ошибке в пакетах OpenJDK для Debian / Ubuntu. Я обнаружил эту ошибку Debian, которая, кажется, связана:

Я подозреваю, что их попытки исправить исходную ошибку ("Доступность не загружается")) ввел эту регрессию.

Мой совет вам будет:

  1. Поднимите новую проблему с Ubuntu / Debian. Позвольте им решить, нужно ли это поднимать вверх по течению, или это их проблема, которую нужно исправить.

  2. Если вы хотите попробовать обходной путь, посмотрите, что произойдет, если вы переименуете java-atk-wrapper.jarтак что лаунчер не может его найти. Это может работать.

  3. В качестве альтернативы (менее хакерской) посмотрите, из какого пакета Ubuntu JAR-файл приходит из в вашей системе . Если это имеет смысл, удалите этот пакет и все, что от него зависит.


1 - NPE происходит потому, что getResource восстанавливает null ... потому чтозагрузчик классов не может найти ресурс манифеста. Вот что должно произойти .

...