gradlex-org/extra-java-module-info

Something wrong with Gradle Tooling

Closed this issue · 2 comments

I am developing an app which is a jpms project to manage my Gradle projects. And I use the extra-java-module-info plugin to make the "gradle-tooling-api-6.7.1.jar" to be a module jar.But when running the code below

var conn = GradleConnector.newConnector()
                .forProjectDirectory(new File("/Users/makhocheung/Projects/java-demo"))
                .connect();
        try (conn) {
            var pj = conn.getModel(GradleProject.class);
            System.out.println(pj.getName());
        }

I got an error that

Exception in thread "main" org.gradle.tooling.GradleConnectionException: Could not create an instance of Tooling API implementation using the specified Gradle distribution 'https://services.gradle.org/distributions/gradle-6.7.1-bin.zip'.
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.loader.DefaultToolingImplementationLoader.create(DefaultToolingImplementationLoader.java:103)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.loader.CachingToolingImplementationLoader.create(CachingToolingImplementationLoader.java:45)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.loader.SynchronizedToolingImplementationLoader.create(SynchronizedToolingImplementationLoader.java:44)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.connection.LazyConsumerActionExecutor.onStartAction(LazyConsumerActionExecutor.java:147)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.connection.LazyConsumerActionExecutor.run(LazyConsumerActionExecutor.java:129)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.connection.CancellableConsumerActionExecutor.run(CancellableConsumerActionExecutor.java:45)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.connection.ProgressLoggingConsumerActionExecutor.run(ProgressLoggingConsumerActionExecutor.java:61)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.connection.RethrowingErrorsConsumerActionExecutor.run(RethrowingErrorsConsumerActionExecutor.java:38)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.async.DefaultAsyncConsumerActionExecutor$1$1.run(DefaultAsyncConsumerActionExecutor.java:67)
	at gradle.tooling.api@6.7.1/org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at gradle.tooling.api@6.7.1/org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
	at gradle.tooling.api@6.7.1/org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
	at java.base/java.lang.Thread.run(Thread.java:832)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.BlockingResultHandler.getResult(BlockingResultHandler.java:46)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.DefaultModelBuilder.get(DefaultModelBuilder.java:51)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.DefaultProjectConnection.getModel(DefaultProjectConnection.java:58)
	at java.demo.main/pub.cellebi.demo.App.main(App.java:15)
Caused by: org.gradle.internal.service.ServiceLookupException: Could not configure services using ConnectionScopeServices.configure().
	at gradle.tooling.api@6.7.1/org.gradle.internal.service.DefaultServiceRegistry.applyConfigureMethod(DefaultServiceRegistry.java:197)
	at gradle.tooling.api@6.7.1/org.gradle.internal.service.DefaultServiceRegistry.findProviderMethods(DefaultServiceRegistry.java:173)
	at gradle.tooling.api@6.7.1/org.gradle.internal.service.DefaultServiceRegistry.addProvider(DefaultServiceRegistry.java:250)
	at org.gradle.internal.service.ServiceRegistryBuilder.build(ServiceRegistryBuilder.java:52)
	at org.gradle.tooling.internal.provider.DefaultConnection.initializeServices(DefaultConnection.java:121)
	at org.gradle.tooling.internal.provider.DefaultConnection.configure(DefaultConnection.java:101)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.connection.AbstractPost12ConsumerConnection.configure(AbstractPost12ConsumerConnection.java:37)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.loader.DefaultToolingImplementationLoader.createConnection(DefaultToolingImplementationLoader.java:108)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.loader.DefaultToolingImplementationLoader.create(DefaultToolingImplementationLoader.java:88)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.loader.CachingToolingImplementationLoader.create(CachingToolingImplementationLoader.java:45)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.loader.SynchronizedToolingImplementationLoader.create(SynchronizedToolingImplementationLoader.java:44)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.connection.LazyConsumerActionExecutor.onStartAction(LazyConsumerActionExecutor.java:147)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.connection.LazyConsumerActionExecutor.run(LazyConsumerActionExecutor.java:129)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.connection.CancellableConsumerActionExecutor.run(CancellableConsumerActionExecutor.java:45)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.connection.ProgressLoggingConsumerActionExecutor.run(ProgressLoggingConsumerActionExecutor.java:61)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.connection.RethrowingErrorsConsumerActionExecutor.run(RethrowingErrorsConsumerActionExecutor.java:38)
	at gradle.tooling.api@6.7.1/org.gradle.tooling.internal.consumer.async.DefaultAsyncConsumerActionExecutor$1$1.run(DefaultAsyncConsumerActionExecutor.java:67)
	at gradle.tooling.api@6.7.1/org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at gradle.tooling.api@6.7.1/org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
	at gradle.tooling.api@6.7.1/org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
	at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: org.gradle.internal.service.ServiceCreationException: Could not create service of type ClassLoaderRegistry using GlobalScopeServices.createClassLoaderRegistry().
	at gradle.tooling.api@6.7.1/org.gradle.internal.service.DefaultServiceRegistry$FactoryMethodService.invokeMethod(DefaultServiceRegistry.java:848)
	at gradle.tooling.api@6.7.1/org.gradle.internal.service.DefaultServiceRegistry$FactoryService.create(DefaultServiceRegistry.java:773)
	at gradle.tooling.api@6.7.1/org.gradle.internal.service.DefaultServiceRegistry$ManagedObjectServiceProvider.getInstance(DefaultServiceRegistry.java:563)
	at gradle.tooling.api@6.7.1/org.gradle.internal.service.DefaultServiceRegistry$SingletonService.get(DefaultServiceRegistry.java:621)
	at gradle.tooling.api@6.7.1/org.gradle.internal.service.DefaultServiceRegistry.applyConfigureMethod(DefaultServiceRegistry.java:191)
	at gradle.tooling.api@6.7.1/org.gradle.internal.service.DefaultServiceRegistry.findProviderMethods(DefaultServiceRegistry.java:173)
	at gradle.tooling.api@6.7.1/org.gradle.internal.service.DefaultServiceRegistry.addProvider(DefaultServiceRegistry.java:250)
	at gradle.tooling.api@6.7.1/org.gradle.internal.service.DefaultServiceRegistry$1.addProvider(DefaultServiceRegistry.java:231)
	at org.gradle.tooling.internal.provider.ConnectionScopeServices.configure(ConnectionScopeServices.java:48)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at gradle.tooling.api@6.7.1/org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
	at gradle.tooling.api@6.7.1/org.gradle.internal.service.ReflectionBasedServiceMethod.invoke(ReflectionBasedServiceMethod.java:34)
	at gradle.tooling.api@6.7.1/org.gradle.internal.service.DefaultServiceRegistry.applyConfigureMethod(DefaultServiceRegistry.java:195)
	... 22 more
Caused by: org.gradle.api.internal.classpath.UnknownModuleException: Cannot locate manifest for module 'gradle-core' in classpath: [/Users/makhocheung/Projects/java-demo].
	at gradle.tooling.api@6.7.1/org.gradle.api.internal.classpath.DefaultModuleRegistry.loadModule(DefaultModuleRegistry.java:142)
	at gradle.tooling.api@6.7.1/org.gradle.api.internal.classpath.DefaultModuleRegistry.getModule(DefaultModuleRegistry.java:117)
	at org.gradle.api.internal.DynamicModulesClassPathProvider.allRequiredModulesOf(DynamicModulesClassPathProvider.java:96)
	at org.gradle.api.internal.DynamicModulesClassPathProvider.gradleExtensionsWithout(DynamicModulesClassPathProvider.java:62)
	at org.gradle.api.internal.DynamicModulesClassPathProvider.findClassPath(DynamicModulesClassPathProvider.java:51)
	at org.gradle.api.internal.DefaultClassPathRegistry.getClassPath(DefaultClassPathRegistry.java:35)
	at org.gradle.initialization.DefaultClassLoaderRegistry.<init>(DefaultClassLoaderRegistry.java:35)
	at org.gradle.internal.service.scopes.GlobalScopeServices.createClassLoaderRegistry(GlobalScopeServices.java:316)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at gradle.tooling.api@6.7.1/org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
	at gradle.tooling.api@6.7.1/org.gradle.internal.service.ReflectionBasedServiceMethod.invoke(ReflectionBasedServiceMethod.java:34)
	at gradle.tooling.api@6.7.1/org.gradle.internal.service.DefaultServiceRegistry$FactoryMethodService.invokeMethod(DefaultServiceRegistry.java:846)
	... 37 more

It seems that the gradleInstallation is null. All is fine in a non-jpms project

@makhocheung this is an interesting usage of this plugin. The Gradle Tooling API should work without issues because it contains everything it needs in the Jar.

The error message looks like you are attempting to run the Tooling API directly from the Gradle distribution. While it is contained there, it is not intended to be used outside of Gradle itself. You should use the separately published Tooling API Jar. See: https://docs.gradle.org/current/userguide/third_party_integration.html#sec:embedding_quickstart

repositories {
    maven { url = uri("https://repo.gradle.org/gradle/libs-releases") }
}

dependencies {
    implementation("org.gradle:gradle-tooling-api:6.7.1")
}

I did a small project using the Tooling API as module and that works:
https://github.com/jjohannes/gradle-tooling-api-as-module

I hope that helps.

I am afraid this problem has to be solved in Gradle and there is currently no simple workaround. See gradle/gradle#6726 (comment) for details.