2017-11-23 150 views
5

Pytanie

Jak mogę dokonać zajęcia z modułu jdk.incubator.httpclient widoczne w czasie wykonywania?Dokonywanie jdk.incubator.httpclient moduł widoczny przy starcie

Co Używam

Java Maven + 9 + HttpClient jdk.incubator.http.HttpClient

Problemy

=> Maven build uszkodzoną podczas korzystania jdk.incubator.HttpClient. Poprawiono z this question dzięki @nullpointer

=> Runtime StackTrace:

java.lang.NoClassDefFoundError: jdk/incubator/http/HttpClient 
at com.foo.Bar.Bar.<clinit>(Bar.java:56) ~[?:?] 
at java.lang.Class.forName0([email protected]/Native Method) ~[?:?] 
at java.lang.Class.forName([email protected]/Class.java:374) ~[?:?] 
Caused by: java.lang.ClassNotFoundException: jdk.incubator.http.HttpClient 
at java.net.URLClassLoader.findClass([email protected]/URLClassLoader.java:388) ~[?:?] 
at java.lang.ClassLoader.loadClass([email protected]/ClassLoader.java:486) ~[?:?] 
at java.lang.ClassLoader.loadClass([email protected]/ClassLoader.java:419) ~[?:?] 
at com.foo.Bar.Bar.<clinit>(Bar.java:56) ~[?:?] 
at java.lang.Class.forName0([email protected]/Native Method) ~[?:?] 
at java.lang.Class.forName([email protected]/Class.java:374) ~[?:?] 

Konstruowanie Sekcja Pom

<build> 
    <finalName>${project.artifactId}</finalName> 
    <sourceDirectory>${project.basedir}/src</sourceDirectory> 

    <resources> 
     <resource> 
      <targetPath>.</targetPath> 
      <filtering>true</filtering> 
      <directory>${project.basedir}/resources</directory> 

      <includes> 
       <include>plugin.yml</include> 
      </includes> 
     </resource> 
    </resources> 

    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-clean-plugin</artifactId> 
      <version>3.0.0</version> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.7.0</version> 

      <configuration> 
       <source>9</source> 
       <target>9</target> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>3.1.0</version> 

      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <minimizeJar>true</minimizeJar> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

Jak widać, używam maven-shade-plugin dla moich uzależnień, ale ponieważ jdk.incubator.http.HttpClient jest częścią JDK, nie ma go w moim słoiku.

próby wykonania jako:

java -jar --add-modules jdk.incubator.httpclient uhc-staging.jar 

wyniki na następującym wyjątkiem:

Error occurred during initialization of VM 
java.lang.module.ResolutionException: Module jdk.incubator.httpclient not found 
at java.lang.module.Resolver.fail([email protected]/Resolver.java:790) 
at java.lang.module.Resolver.resolveRequires([email protected]/Resolver.java:94) 
at java.lang.module.Configuration.resolveRequiresAndUses([email protected]/Configuration.java:370) 
at java.lang.module.ModuleDescriptor$1.resolveRequiresAndUses([email protected]/ModuleDescriptor.java:1986) 
at jdk.internal.module.ModuleBootstrap.boot([email protected]/ModuleBootstrap.java:263) 
at java.lang.System.initPhase2([email protected]/System.java:1927) 
+0

@nullpointer The słoiku jest używany jako dodatek. Istnieje metoda 'enable()', która jest wywoływana, gdy proces główny ją włącza. Głównym procesem jest kolejny plik jar, który zaczyna się od 'java -jar server.jar' –

+0

@nullpointer Przepraszamy za bycie zbyt krótkim. Mój jar jest używany jako wtyczka do api Bukkit. Kiedy uruchamia się serwer Bukkit, ładuje wszystkie wtyczki, w tym moje, i wywołuje metodę 'enable()'. W mojej metodzie enable zaczynam od wywołania mojego api z HttpClient, aby załadować pewne informacje o uprawnieniach użytkownika. –

+0

Idealnie powinieneś zaktualizować pytanie z częścią integracyjną bieżącego słoika z Bukkitem i użytym tam kodem. [Chociaż, szczerze, nie jestem zbyt świadomy tego, jak działa Bukkit.] – nullpointer

Odpowiedz

3

W discussion, szczegóły wyprowadzone, że wykonania: -

java --list-modules 

nie zawiera jdk.incubator.httpclient jako modułu, który jest powodem, dla którego został zgłoszony kod j.l.m.ResolutionException. Stąd, rozwiązanie to będzie uaktualniania wersji JDK zainstalowany w najnowszej wersji (które powinny obejmować moduł inkubator), a następnie próbuje uruchomić aplikację przy użyciu tego samego polecenia jak sugeruje: -

java -jar --add-modules jdk.incubator.httpclient uhc-staging.jar 
+0

Aby się rozwinąć, miałem pakiet 'openjdk-9-jdk' na Ubuntu 16.10, który nie jest już obsługiwaną wersją Ubuntu. Aktualizacja do 17.04 pozwoliła mi zainstalować pakiet 'oracle-java9-installer', który nie został zainstalowany przy pomocy 16.10. Ponieważ pakiet 'openjdk-9-jdk' nie jest dołączony do modułu inkubatora, użycie' --add-modules jdk.incubator.httpclient' nie będzie działać. Użycie 'oracle-java9-installer' i uruchomienie słownika z' --add-modules jdk.incubator.httpclient' naprawił problem –

+0

Również, aby uniknąć używania '--add-modules' w linii poleceń. Trzeba [wykonać przy użyciu modułu moduł jak szczegółowo w innej odpowiedzi] (https://stackoverflow.com/a/47468106/1746118). – nullpointer