Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

removeUnusedImports does not work on Java 9 #83

Closed
marcphilipp opened this issue Mar 8, 2017 · 12 comments
Closed

removeUnusedImports does not work on Java 9 #83

marcphilipp opened this issue Mar 8, 2017 · 12 comments
Labels

Comments

@marcphilipp
Copy link

see https://travis-ci.org/junit-team/junit5/jobs/209088615

Step 'removeUnusedImports' found problem in 'src/test/java/example/DisabledClassDemo.java':
javax/tools/JavaFileManager$Location
java.lang.NoClassDefFoundError: javax/tools/JavaFileManager$Location
	at java.lang.Class.getDeclaredMethods0(java.base@9-ea/Native Method)
	at java.lang.Class.privateGetDeclaredMethods(java.base@9-ea/Class.java:2948)
	at java.lang.Class.privateGetMethodRecursive(java.base@9-ea/Class.java:3293)
	at java.lang.Class.getMethod0(java.base@9-ea/Class.java:3263)
	at java.lang.Class.getMethod(java.base@9-ea/Class.java:1972)
	at com.diffplug.spotless.java.GoogleJavaFormatStep$State.createRemoveUnusedImportsOnly(GoogleJavaFormatStep.java:110)
	at com.diffplug.spotless.FormatterStepImpl$Standard.format(FormatterStepImpl.java:73)
	at com.diffplug.spotless.FormatterStep$Strict.format(FormatterStep.java:75)
	at com.diffplug.spotless.Formatter.compute(Formatter.java:218)
	at com.diffplug.spotless.Formatter.isClean(Formatter.java:163)
	at com.diffplug.gradle.spotless.SpotlessTask.check(SpotlessTask.java:213)
	at com.diffplug.gradle.spotless.SpotlessTask.performAction(SpotlessTask.java:169)
	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(java.base@9-ea/Native Method)
	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(java.base@9-ea/NativeMethodAccessorImpl.java:62)
	at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@9-ea/DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(java.base@9-ea/Method.java:535)
	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
	at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$IncrementalTaskAction.doExecute(DefaultTaskClassInfoStore.java:163)
	at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
	at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:123)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:95)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:76)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:55)
	at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
	at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
	at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
	at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
	at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:236)
	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:228)
	at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:61)
	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:228)
	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:215)
	at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:77)
	at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:58)
	at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:32)
	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:113)
	at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
	at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
	at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
	at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
	at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
	at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
	at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
	at org.gradle.initialization.DefaultGradleLauncher$RunTasksAction.execute(DefaultGradleLauncher.java:256)
	at org.gradle.initialization.DefaultGradleLauncher$RunTasksAction.execute(DefaultGradleLauncher.java:253)
	at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:175)
	at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:119)
	at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:102)
	at org.gradle.launcher.exec.GradleBuildController.run(GradleBuildController.java:71)
	at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:75)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:49)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:49)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:31)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:47)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
	at org.gradle.util.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:46)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@9-ea/ThreadPoolExecutor.java:1161)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@9-ea/ThreadPoolExecutor.java:635)
	at java.lang.Thread.run(java.base@9-ea/Thread.java:843)
	at java.net.URLClassLoader.findClass(java.base@9-ea/URLClassLoader.java:388)
	at java.lang.ClassLoader.loadClass(java.base@9-ea/ClassLoader.java:486)
	at java.lang.ClassLoader.loadClass(java.base@9-ea/ClassLoader.java:419)
	... 95 more
:documentation:spotlessJava FAILED
@jbduncan
Copy link
Member

jbduncan commented Mar 8, 2017

I'm not entirely surprised that it failed. Spotless's removeUnusedImports feature forwards onto one provided by google-java-format, and google-java-format itself uses a custom build of OpenJDK's javac to parse source code, which itself doesn't include Jigsaw IIRC, which I suspect is causing this exception.

It's not clear to me that there's anything we can do, other than create a custom step that removes unused imports, or to find another library which lets us to remove unused imports.

@nedtwigg nedtwigg added the bug label Mar 9, 2017
@nedtwigg
Copy link
Member

nedtwigg commented Mar 9, 2017

Agreed. Until google-java-format supports Java 9, this will be an unfixable bug for us. We'll update this issue when that changes.

@marcphilipp
Copy link
Author

No worries. This is not a blocker for us at the moment. I just wanted you guys know.

sormuras added a commit to junit-team/junit5 that referenced this issue Mar 15, 2017
@sormuras
Copy link
Contributor

Class javax/tools/JavaFileManager$Location is located in module java.compiler provided by the JDK 9.

"Someone" has to declare the usage of module java.compiler somewhere:

  1. google-java-format
  2. spotless
  3. Gradle project build configuration (here JUnit 5)
  4. Gradle environment (daemon?)

sormuras added a commit to junit-team/junit5 that referenced this issue Mar 15, 2017
sormuras added a commit to junit-team/junit5 that referenced this issue Mar 15, 2017
sormuras added a commit to junit-team/junit5 that referenced this issue Mar 15, 2017
sormuras added a commit to junit-team/junit5 that referenced this issue Mar 15, 2017
sormuras added a commit to junit-team/junit5 that referenced this issue Mar 15, 2017
sormuras added a commit to junit-team/junit5 that referenced this issue Mar 15, 2017
sormuras added a commit to junit-team/junit5 that referenced this issue Mar 15, 2017
sormuras added a commit to junit-team/junit5 that referenced this issue Mar 15, 2017
sormuras added a commit to junit-team/junit5 that referenced this issue Mar 15, 2017
sormuras added a commit to junit-team/junit5 that referenced this issue Mar 17, 2017
@jbduncan
Copy link
Member

@sormuras Declaring usage of "java.compiler" is something we could do if google-java-format itself doesn't, but I personally have very little knowledge of Jigsaw modules, so although I gather that it would involve us creating at least one module-info.java file somewhere, I wouldn't know where these files would go or what they should contain.

@cobexer
Copy link
Contributor

cobexer commented Jan 3, 2018

Any updates on Java 9 support? I see that Spotless uses google-java-format 1.3 while maven central has version 1.5: https://search.maven.org/#artifactdetails%7Ccom.google.googlejavaformat%7Cgoogle-java-format%7C1.5%7Cjar

@jbduncan
Copy link
Member

jbduncan commented Jan 3, 2018

@cobexer I don't know about Java 9 support, but I do know that Spotless can and does support google-java-format 1.5, even if it's not the default version yet. To use 1.5, set your Spotless config as follows.

spotless {
  java {
    googleJavaFormat('1.5')
  }
}

@cobexer
Copy link
Contributor

cobexer commented Jan 3, 2018

@jbduncan I didn't notice that, however it also doesn't change the error =(

@jbduncan
Copy link
Member

jbduncan commented Jan 7, 2018

@cobexer I admit that I'm really puzzled by this error. I get the same error that @marcphilipp reported in his initial message when I run ./gradlew spotlessCheck -Dorg.gradle.java.home=<JAVA-9-PATH> on JUnit 5 master, but when I run it against a small closed-source project that I work on which uses Java 8, it doesn't report any errors. 🤔

@sormuras, if we wanted to declare the usage of module java.compiler in Spotless when running on Java 9+, do you know how we could go about doing so?

@nedtwigg
Copy link
Member

As of Spotless 3.24.1, we should work on Java 9+ (thanks to #426). This is confirmed for freshmark, unconfirmed for the issues in this thread. Can anyone chime in if this is fixed for them in 3.24.1+?

@cobexer
Copy link
Contributor

cobexer commented Aug 20, 2019

I just verified removeUnusedImports works on Gradle 5.4.1 w/ Java 11.0.4 and spotless 3.24.1!

@nedtwigg
Copy link
Member

Thanks for the verification!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

5 participants