2017-11-10 71 views
7

Załóżmy, że mam pewną bibliotekę lib.jar, dla której nie mam kodu źródłowego (lub jest ona napisana w języku innym niż Java, który nie jest jeszcze zaznajomiony z modułami). lib.jar nie ma module-info.class i nie chcę używać go jako modułu automatycznego, więc chciałbym wprowadzić do niego module-info.class.Jak wprowadzić deklarację modułu do JAR?

ja najpierw wygenerować module-info.java pomocą następującego polecenia:

jdeps --generate-module-info . lib.jar 

Załóżmy, że generowane coś takiego:

module lib { 
    exports package1; 
    exports package2; 
} 

Wtedy staram się go skompilować ale javac powiodło się, ponieważ pakiety package1 i package2 zrobić nie istnieje:

> javac module-info.java 
module-info.java:4: error: package is empty or does not exist: package1 

Oczywiście, mogę tworzyć katalogi package1 i package2 z klasami dummy, ale czy jest jakieś lepsze podejście?

Odpowiedz

6

Tak, jest to możliwe z opcją --patch-module. Ta opcja jest najczęściej używany w czasie wykonywania, ale także działa w czasie kompilacji:

javac --patch-module <module name>=<path to jar> module-info.java 
+0

kiedy używać tego polecenia, wciąż pojawia się błąd: > javac module-info.java module-info.java:4: error: Pakiet jest pusta lub nie istnieje : package1 Jakieś idei, dlaczego może nie działać dla mnie? –

+0

@TiagoSantos Czy pakiet istnieje w JAR? – ZhekaKozlov

+0

tak, wszystko wydaje się w porządku, udało mi się to zrobić przy użyciu powyższego rozwiązania od nullpointer, zgadzam się, że twoje rozwiązanie jest bardziej eleganckie, jedynym problemem jest to, że nie działa z moim .jars:/próbowałem w 2 różnych –

5

Alternatywnie, do kompilacji module-info.java generowane trzeba również wyodrębnić zawartość słoika do katalogu.

Następnie skompiluj module-info.java z katalogiem wyjściowym (-d) ustawionym w katalogu, w którym wyodrębniono zawartość.

Credits :- Alan

+1

Dzięki, nie wiedziałem o tym podejściu – ZhekaKozlov

+1

ja przyjąłem własną odpowiedź, ponieważ myślę, że moja droga jest nieco bardziej elegancka. Wyodrębnianie plików jest dodatkowym krokiem, który jest nieco niewygodny (szczególnie w przypadku narzędzi). – ZhekaKozlov

+0

@ZhekaKozlov Zgadzam się, to naprawdę czystsze. Mam nadzieję, że nie powinienem jednak usunąć tego.;) – nullpointer