ResolutionException module a module b to module c

#1

Hey Leute,

ich habe nach etwas längerer Java-Abstinenz und mit viel ABAP + JavaScript wieder eine Aufgabe im Java-Umfeld bekommen. Ich habe mit Java 8 aufgehört und mit Java 9 kam ja so einiges neues… Im Zuge meiner Aufgabe muss ich u.a. eine Java Anwendung mit SAP programmieren, die Speech-To-Text mit der Google Cloud benutzt.

Da ich mich erstmal wieder einprogrammieren wollte, wollte ich Schritt für Schritt das erstmal austesten mit Java 11. Das standardmässige Hello World ging wie immer problemlos. Beim Abarbeiten des Google-Tutorials bekomm ich aber wieder die Krise mit den neuen Modulen. Ewiges rumprobiere und gegoogle half mir zwar etwas weiter beim Verstehen, WARUM die Fehler kommen, aber nicht WIE ich sie löse.

Also aktueller Stand:

Klasse:

package test;

//Imports the Google Cloud client library
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Dataset;
import com.google.cloud.bigquery.DatasetInfo;


public class Test {

	 public static void main(String... args) throws Exception {
		    // Instantiate a client. If you don't specify credentials when constructing a client, the
		    // client library will look for credentials in the environment, such as the
		    // GOOGLE_APPLICATION_CREDENTIALS environment variable.
		    BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
		    // The name for the new dataset
		    String datasetName = "my_new_dataset";

		    // Prepares a new dataset
		    Dataset dataset = null;
		    DatasetInfo datasetInfo = DatasetInfo.newBuilder(datasetName).build();

		    // Creates the dataset
		    dataset = bigquery.create(datasetInfo);
		    com.google.cloud.bigquery.BigQuery b;
		    System.out.printf("Dataset %s created.%n", dataset.getDatasetId().getDataset());
		  }
	 
}

Module-Info:

module test {
	requires java.xml;
	requires java.base;
	requires google.cloud.bigquery;
}

Wenn ich das so starten will, bekomm ich nur:

Error occurred during initialization of boot layer
java.lang.module.ResolutionException: Modules jsr305 and java.annotation export package javax.annotation to module com.google.api.client

Die Lib von Google is im Module-Path. Laut SO ist das Problem, das beide genannten Module ein Package exportieren, es mit den Modulen aber nicht erlaubt ist. Das kann bei älteren LIBs durchaus vorkommen, daher solle man sie im Class-Path benutzen.
Zusätzlich bekomme ich in der Module-Info noch die Warnung:

Name of automatic module ‘google.cloud.bigquery’ is unstable, it is
derived from the module’s file name.

Bisher auch keine Lösung dafür.

Also löschen aus der Module-Info und ab in den Class-Path. Dann bekomm ich überall in der Klasse aber nur “Type not accessible”… Das Paket “com.google.cloud.bigquery” findet er, danach is aber Schluss.

Ich blick da noch nich so wirklich durch… Kann mich nich erinnern in Java8 jemals so viele Probleme beim einfach einbinden einer Lib gehabt zu haben.

0 Likes

#2

Wenn ich mich recht entsinne heißt das, dass es kein “richtiges” Modul ist, sondern eines aus einer normalen JAR gebildet worden ist. Wäre vielleicht einen Versuch wert, das in ein richtiges Modul umzuwandeln, weil man dann natürlich mehr Kontrolle über das Verhalten hat.
Habe ich aber selbst noch nicht gemacht, und kann auch nicht einschätzen, wie sinnvoll bzw. schwierig das wäre.

0 Likes

#3

Aber wie binde ich die nun ein? Kann ja schlecht die Lib verändern, hole die mir auch nur durch das Eclipse-Plugin.

0 Likes

#4

Also auf gut deutsch gesagt geht mir das ganze inzwischen ziemlich auf den Nerv. Nach 8 (!) Stunden rumprobieren mit den Modulen, dem Module-Path, der Module-Info und dem Class-Path, alles was ich in Google fand hat entweder nicht geholfen, oder hab ich nicht verstanden… Wird dann wohl erstmal wieder auf Java 8 hinauslaufen

0 Likes