2017-04-23 11 views
7

Próbuję uruchomić aplikację z Javą 9, ale niestety jedna z prostych zależności JAR, gdy próbuje załadować zasób przy użyciu classLoader.getResource(name), otrzymuje zamiast niej wartość null.Jak pozwolić modułowi automatycznemu znaleźć własne zasoby w Javie 9?

To, oczywiście, działa w Javie 8.

oświadczyłem zależny od modułu w pytaniu za pomocą pliku modułu, nawiązując do nazwy modułu przez jego nazwę słoik (okropny) i dodaje się słoik tak jak jest (bez dostosowywania dla środowiska Java 9) przy użyciu opcji --module-path.

Oto moja przybliżona deklaracja plik modułu:

module my.mod { 
    requires ivy; // the file is called ivy-2.4.0.jar 
} 

I biegnę z tym poleceniem:

java --module-path my-mod.jar:ivy-2.4.0.jar -m my.mod 

Kiedy uruchomić aplikację, to działa dobrze, jeśli biblioteka nie próbują załaduj ten zasób ... ale jeśli tak, to dostaje NullPointerException w linii, którą próbuje użyć zasobu.

Widzę, że zasób jest obecny we właściwej ścieżce w pliku jar.

Próbowałem uruchomiony mojej aplikacji zarówno jako słoik (pokazany powyżej) i tylko z plikami klas:

java --module-path modules-dir:ivy-2.4.0.jar -m my.module/my.Main 

W tym ostatnim przypadku, błąd jest inny, ale powiązany: Ivy nie może nawet znaleźć plik właściwości, który próbuje załadować z własnego słoika!

Czy istnieje obejście problemu, czy jest to znany błąd, czy też robię coś nie tak?

+0

Skąd wziąłeś Java 9? Czy jest wydany? 2017 06 15 –

+2

Pobierz [SDKMAN] (http://sdkman.io/) i zainstaluj z 'sdk install java 9ea167'. Jest to wersja EA (Early Access). – Renato

+0

Po prostu nie mogłem uzyskać odpowiedzi na pytanie, jaka jest relacja pliku my-mod.jar z plikiem modułu my.mod? Czy chcesz, aby plik my-mod.jar był zależny od ivy-2.4.0.jar? – chebus

Odpowiedz

2

Spróbuj dodać deklarację "otwórz" do modułu automatycznego "bluszcz". To umożliwia dostęp do zasobów:

java --add-opens ivy/<dot.separated.path.to.resources>=ALL-UNNAMED --module-path my-mod.jar:ivy-2.4.0.jar -m my.mod 
+0

"ALL-UNNAMED" może być po prostu "my.mod" tutaj. Odpowiedziałem (https://stackoverflow.com/a/46891860/1746118) na pokrewne pytanie, które ma charakter odwrotny w odniesieniu do zasobów, w których powiązałem [strategię kapsułkowania] (https://docs.oracle) .com/javase/9/docs/api/java/lang/Module.html # getResourceAsStream-java.lang.String-) zasobów. Możesz również z tego skorzystać. Dodałby wartość do odpowiedzi w terminach 'dot.separated.path.to.resources'. – nullpointer

Powiązane problemy