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

InaccessibleObjectException running tests with Java 9 #1095

Closed
alicederyn opened this issue Jan 4, 2017 · 23 comments
Closed

InaccessibleObjectException running tests with Java 9 #1095

alicederyn opened this issue Jan 4, 2017 · 23 comments

Comments

@alicederyn
Copy link
Contributor

A recent build of Java 9 has broken reflection in Gradle.

Expected Behavior

Tests run

Current Behavior

java.lang.ExceptionInInitializerError
        at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:57)
        at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:67)
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected java.lang.Package[] java.lang.ClassLoader.getPackages() accessible: module java.base does not "opens java.lang" to unnamed module @13b6d03
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:207)
        at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:192)
        at java.base/java.lang.reflect.Method.setAccessible(Method.java:186)
        at worker.org.gradle.internal.reflect.JavaMethod.<init>(JavaMethod.java:42)
        at worker.org.gradle.internal.reflect.JavaMethod.<init>(JavaMethod.java:32)
        at worker.org.gradle.internal.reflect.JavaMethod.<init>(JavaMethod.java:36)
        at worker.org.gradle.internal.reflect.JavaReflectionUtil.method(JavaReflectionUtil.java:223)
        at worker.org.gradle.internal.classloader.FilteringClassLoader.<clinit>(FilteringClassLoader.java:48)
        ... 2 more

Context

I'm running my annotation processor against Java 9 to ensure no regressions. Unfortunately it broke a few days ago when Travis started pulling a recent build. Build 9-ea-143 passed; 149 and 150 (the most recent) fail; but I'm unsure about exactly which version of Java 9 introduced the regression.

Steps to Reproduce (for bugs)

https://travis-ci.org/google/FreeBuilder/builds/188953306

Prior to Circle upgrading to Java(TM) SE Runtime Environment build 9-ea+149, this exact configuration passed: https://travis-ci.org/google/FreeBuilder/builds/183979434

Your Environment

https://scans.gradle.com/s/p32r6miu7yevi

@alicederyn
Copy link
Contributor Author

I can work around this in my own builds by adding the following (the conditional is needed because only a few of my tests run with JVM 9):

  tasks.withType(Test) {
    if (executable == java9.java) {
      jvmArgs += ['--add-opens', 'java.base/java.lang=ALL-UNNAMED']
    }
  }

alicederyn added a commit to inferred/FreeBuilder that referenced this issue Jan 4, 2017
In the most recent builds of Java 9, we now need to pass
`--add-opens java.base/java.lang=ALL-UNNAMED` to avoid
InaccessibleObjectException instances being thrown from within Gradle internal code.
@eriwen
Copy link
Contributor

eriwen commented Jan 10, 2017

@ChrisAlice Thanks for the well-written issue. I am adding this to our Java 9 epic which we'll prioritize sometime in the next few months.

@Baneeishaque
Copy link

Same issue when running --status command line option. Can't use buildship with eclipse ( using local gradle distribution). Please refer below stack trace and resolve it, because i love gradle...

C:\Users\DK_win10-Asus_3ghz>gradle -v


Gradle 3.4-rc-1

Build time: 2017-01-26 15:48:49 UTC
Revision: 54c8a2c

Groovy: 2.4.7
Ant: Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM: 9-ea (Oracle Corporation 9-ea+154)
OS: Windows 10 10.0 amd64

C:\Users\DK_win10-Asus_3ghz>gradle -S --status

FAILURE: Build failed with an exception.

  • What went wrong:
    java.lang.ExceptionInInitializerError (no error message)

  • Try:
    Run with --info or --debug option to get more log output.

  • Exception is:
    java.lang.ExceptionInInitializerError
    at org.gradle.initialization.DefaultClassLoaderRegistry.restrictTo(DefaultClassLoaderRegistry.java:40)
    at org.gradle.initialization.DefaultClassLoaderRegistry.restrictToGradleApi(DefaultClassLoaderRegistry.java:36)
    at org.gradle.initialization.DefaultClassLoaderRegistry.(DefaultClassLoaderRegistry.java:30)
    at org.gradle.internal.service.scopes.GlobalScopeServices.createClassLoaderRegistry(GlobalScopeServices.java:213)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:543)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
    at org.gradle.internal.service.DefaultServiceRegistry.invoke(DefaultServiceRegistry.java:462)
    at org.gradle.internal.service.DefaultServiceRegistry.access$1200(DefaultServiceRegistry.java:84)
    at org.gradle.internal.service.DefaultServiceRegistry$FactoryMethodService.invokeMethod(DefaultServiceRegistry.java:805)
    at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.create(DefaultServiceRegistry.java:761)
    at org.gradle.internal.service.DefaultServiceRegistry$ManagedObjectProvider.getInstance(DefaultServiceRegistry.java:598)
    at org.gradle.internal.service.DefaultServiceRegistry$SingletonService.get(DefaultServiceRegistry.java:643)
    at org.gradle.internal.service.DefaultServiceRegistry.applyConfigureMethod(DefaultServiceRegistry.java:253)
    at org.gradle.internal.service.DefaultServiceRegistry.findProviderMethods(DefaultServiceRegistry.java:214)
    at org.gradle.internal.service.DefaultServiceRegistry.addProvider(DefaultServiceRegistry.java:352)
    at org.gradle.internal.service.ServiceRegistryBuilder.build(ServiceRegistryBuilder.java:52)
    at org.gradle.launcher.cli.BuildActionsFactory.createGlobalClientServices(BuildActionsFactory.java:148)
    at org.gradle.launcher.cli.BuildActionsFactory.showDaemonStatus(BuildActionsFactory.java:100)
    at org.gradle.launcher.cli.BuildActionsFactory.createAction(BuildActionsFactory.java:74)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.createAction(CommandLineActionFactory.java:249)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:239)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:217)
    at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:33)
    at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:210)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:174)
    at org.gradle.launcher.Main.doAction(Main.java:33)
    at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:543)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:60)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:37)
    at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
    Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected java.lang.Package[] java.lang.ClassLoader.getPackages() accessible: module java.base does not "opens java.lang" to unnamed module @7354b8c5
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:207)
    at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:192)
    at java.base/java.lang.reflect.Method.setAccessible(Method.java:186)
    at org.gradle.internal.reflect.JavaMethod.(JavaMethod.java:42)
    at org.gradle.internal.reflect.JavaMethod.(JavaMethod.java:32)
    at org.gradle.internal.reflect.JavaMethod.(JavaMethod.java:36)
    at org.gradle.internal.reflect.JavaReflectionUtil.method(JavaReflectionUtil.java:223)
    at org.gradle.internal.classloader.FilteringClassLoader.(FilteringClassLoader.java:49)
    ... 40 more

@marcphilipp
Copy link
Contributor

Same here with 3.4. Any news on this issue?

@TimvdLippe
Copy link

We are now also facing this issue for Mockito. Would like to see a fix, such that we can properly prepare our library for Java 9.

@dreab8
Copy link

dreab8 commented Mar 27, 2017

We are facing the same with Hibernate.
gradle-3.5-rc-2 has the same problem.

@sormuras
Copy link

sormuras commented Apr 4, 2017

My current findings (don't call this hack a solution) with Travis + jdk-9-162 are:

  • use GRADLE_OPTS="--add-opens java.base/java.lang=ALL-UNNAMED"
  • --no-daemon (no ./buildSrc directory)
  • replace Gradles groovy-all-2.4.7.jar with version 2.4.10 (keep the 2.4.7 name)

Travis configuration file: https://github.com/junit-team/junit5/blob/travis_jkd9_build/.travis.yml
buildSrc-Daemon discussion (monologue): https://discuss.gradle.org/t/prevent-internal-buildsrc-compiler-to-spawn-a-daemon/22181

@chenrui333
Copy link

+1

$gradle --version

------------------------------------------------------------
Gradle 3.4.1
------------------------------------------------------------

Build time:   2017-03-03 19:45:41 UTC
Revision:     9eb76efdd3d034dc506c719dac2955efb5ff9a93

Groovy:       2.4.7
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          9-ea (Oracle Corporation 9-ea+164)
OS:           Mac OS X 10.12.3 x86_64
$gradle init --type java-library --debug --stacktrace
11:00:05.193 [INFO] [org.gradle.internal.nativeintegration.services.NativeServices] Initialized native services in: /Users/ruichen/.gradle/native
11:00:05.551 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
11:00:05.556 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] FAILURE: Build failed with an exception.
11:00:05.558 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
11:00:05.558 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * What went wrong:
11:00:05.563 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] java.lang.ExceptionInInitializerError (no error message)
11:00:05.564 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 
11:00:05.564 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] * Exception is:
11:00:05.567 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] java.lang.ExceptionInInitializerError
11:00:05.567 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.initialization.DefaultClassLoaderRegistry.restrictTo(DefaultClassLoaderRegistry.java:40)
11:00:05.567 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.initialization.DefaultClassLoaderRegistry.restrictToGradleApi(DefaultClassLoaderRegistry.java:36)
11:00:05.568 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.initialization.DefaultClassLoaderRegistry.<init>(DefaultClassLoaderRegistry.java:30)
11:00:05.568 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.service.scopes.GlobalScopeServices.createClassLoaderRegistry(GlobalScopeServices.java:213)
11:00:05.568 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
11:00:05.568 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
11:00:05.568 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
11:00:05.568 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at java.base/java.lang.reflect.Method.invoke(Method.java:563)
11:00:05.569 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
11:00:05.569 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.service.DefaultServiceRegistry.invoke(DefaultServiceRegistry.java:462)
11:00:05.569 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.service.DefaultServiceRegistry.access$1200(DefaultServiceRegistry.java:84)
11:00:05.569 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.service.DefaultServiceRegistry$FactoryMethodService.invokeMethod(DefaultServiceRegistry.java:805)
11:00:05.569 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.service.DefaultServiceRegistry$FactoryService.create(DefaultServiceRegistry.java:761)
11:00:05.569 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.service.DefaultServiceRegistry$ManagedObjectProvider.getInstance(DefaultServiceRegistry.java:598)
11:00:05.570 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.service.DefaultServiceRegistry$SingletonService.get(DefaultServiceRegistry.java:643)
11:00:05.570 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.service.DefaultServiceRegistry.applyConfigureMethod(DefaultServiceRegistry.java:253)
11:00:05.570 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.service.DefaultServiceRegistry.findProviderMethods(DefaultServiceRegistry.java:214)
11:00:05.570 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.service.DefaultServiceRegistry.addProvider(DefaultServiceRegistry.java:352)
11:00:05.570 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.service.ServiceRegistryBuilder.build(ServiceRegistryBuilder.java:52)
11:00:05.571 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.launcher.cli.BuildActionsFactory.createGlobalClientServices(BuildActionsFactory.java:148)
11:00:05.571 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.launcher.cli.BuildActionsFactory.runBuildWithDaemon(BuildActionsFactory.java:108)
11:00:05.571 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.launcher.cli.BuildActionsFactory.createAction(BuildActionsFactory.java:83)
11:00:05.571 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.createAction(CommandLineActionFactory.java:249)
11:00:05.571 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:239)
11:00:05.571 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:217)
11:00:05.572 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:33)
11:00:05.572 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.launcher.cli.JavaRuntimeValidationAction.execute(JavaRuntimeValidationAction.java:24)
11:00:05.572 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)
11:00:05.572 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)
11:00:05.572 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:210)
11:00:05.572 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:174)
11:00:05.572 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.launcher.Main.doAction(Main.java:33)
11:00:05.572 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
11:00:05.572 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
11:00:05.573 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
11:00:05.573 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
11:00:05.573 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at java.base/java.lang.reflect.Method.invoke(Method.java:563)
11:00:05.573 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:60)
11:00:05.573 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:37)
11:00:05.573 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
11:00:05.573 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected java.lang.Package[] java.lang.ClassLoader.getPackages() accessible: module java.base does not "opens java.lang" to unnamed module @1ebea008
11:00:05.573 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:337)
11:00:05.573 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:281)
11:00:05.573 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:197)
11:00:05.574 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at java.base/java.lang.reflect.Method.setAccessible(Method.java:191)
11:00:05.574 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.reflect.JavaMethod.<init>(JavaMethod.java:42)
11:00:05.574 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.reflect.JavaMethod.<init>(JavaMethod.java:32)
11:00:05.574 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.reflect.JavaMethod.<init>(JavaMethod.java:36)
11:00:05.574 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.reflect.JavaReflectionUtil.method(JavaReflectionUtil.java:223)
11:00:05.574 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   at org.gradle.internal.classloader.FilteringClassLoader.<clinit>(FilteringClassLoader.java:49)
11:00:05.574 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter]   ... 40 more
11:00:05.575 [ERROR] [org.gradle.internal.buildevents.BuildExceptionReporter] 

@sormuras
Copy link

Use new JDK_JAVA_OPTIONS as proposed here: #1461 by @sdfelts

@chenrui333
Copy link

chenrui333 commented Apr 11, 2017

@sormuras Build is good with the specified JDK_JAVA_OPTIONS:

$export JDK_JAVA_OPTIONS='--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED'

Thanks!

@mikehearn
Copy link

The cause is ... no surprise ... that Gradle is poking into the internals of the ClassLoader class. Apparently, in order to find out what packages the system classloader has already loaded so it can expose them without exposing its own internals.

FilteringClassLoader is actually the sort of thing Jigsaw is meant to fix more cleanly in the long run: we won't need this kind of classloader games if Gradle itself becomes modularised.

However, for now, the issue remains. The above workarounds get the show back on the road temporarily but a better fix would be for Gradle to simply either hard-code the list of "system packages" it actually wants (it seems the current list could be quite affected by random things happening in the system anyway?), or use the Java 9 modules API to reflect java.base and expose all of that. Either approach would avoid the need to bypass visibility and access the classloader internals.

@mlchung
Copy link

mlchung commented May 5, 2017

To find the list of Package objects defined by the application class loader, you can use ClassLoader::getDefinedPackages.

To find the list of Package objects defined by platform class loader and bootstrap class loader, you can do the following:

        Set pkgs = 
            Stream.of(ClassLoader.getSystemClassLoader().getDefinedPackages())
                  .map(Package::getName)
                  .collect(Collectors.toSet());

        Package[] sysPkgs = Stream.of(Package.getPackages())
                                  .filter(p -> !pkgs.contains(p.getName()))
                                  .toArray(Package[]::new);

On the other hand, FilteringClassLoader::SYSTEM_PACKAGES is a static field that only lists the system packages defined in the runtime at the point when FilteringClassLoader class is initialized and a package is defined only when a class of such package name is loaded. So the question is: should this get the list of all packages in the system modules including the ones that are not yet defined in the runtime?

@mlchung
Copy link

mlchung commented May 5, 2017

I think a simple fix for now is to replace the call ClassLoader::getPackages with the suggested code above when running on JDK 9 to get the defined packages by the platform class loader. ClassLoader::getDefinedPackages is a new JDK 9 API.

@mikehearn
Copy link

mikehearn commented May 6, 2017

Yes, that looks like a good improvement. It will fix the problem by avoiding accessing the Java internals.

The task the code is doing will remain dubious though. I think what it actually wants to do is more like this:

Module mod = Object.class.getModule();
mod.getPackages().stream().filter(mod::isExported)

On my Java 9 this yields:

java.io
java.lang
java.lang.annotation
java.lang.invoke
java.lang.module
java.lang.ref
java.lang.reflect
java.math
java.net
java.net.spi
java.nio
java.nio.channels
java.nio.channels.spi
java.nio.charset
java.nio.charset.spi
java.nio.file
java.nio.file.attribute
java.nio.file.spi
java.security
java.security.acl
java.security.cert
java.security.interfaces
java.security.spec
java.text
java.text.spi
java.time
java.time.chrono
java.time.format
java.time.temporal
java.time.zone
java.util
java.util.concurrent
java.util.concurrent.atomic
java.util.concurrent.locks
java.util.function
java.util.jar
java.util.regex
java.util.spi
java.util.stream
java.util.zip
javax.crypto
javax.crypto.interfaces
javax.crypto.spec
javax.net
javax.net.ssl
javax.security.auth
javax.security.auth.callback
javax.security.auth.login
javax.security.auth.spi
javax.security.auth.x500
javax.security.cert

which looks reasonable.

@mlchung
Copy link

mlchung commented May 6, 2017

The FilteringClassLoader delegates to the platform class loader to define any system class. So I think it should use Module::getPackages and no need to filter isExported. Also it should get all modules defined to the bootstrap class loader and platform class loader.

snicoll added a commit to snicoll/spring-boot that referenced this issue May 10, 2017
This commit fixes the build of the gradle plugin with Java 9.

See gradle/gradle#1095
snicoll added a commit to snicoll/spring-boot that referenced this issue May 10, 2017
This commit fixes the build of the gradle plugin with Java 9.

See gradle/gradle#1095
wilkinsona pushed a commit to spring-projects/spring-boot that referenced this issue May 12, 2017
This commit fixes the build of the gradle plugin with Java 9.

See gradle/gradle#1095
snicoll added a commit to spring-projects/spring-boot that referenced this issue May 15, 2017
This commit fixes the build of the gradle plugin with Java 9.

See gradle/gradle#1095
snicoll added a commit to spring-projects/spring-boot that referenced this issue May 29, 2017
This commit fixes the build of the gradle plugin with Java 9.

See gradle/gradle#1095
@randomnetcat
Copy link

Can confirm broken on 4.0

@eriwen
Copy link
Contributor

eriwen commented Jun 14, 2017

@meowingtwurtle Please try the latest 4.1 nightly.

@randomnetcat
Copy link

randomnetcat commented Jun 14, 2017

Works on 4.1-20170612195456+0000 with no external JDK_JAVA_OPTIONS

@sormuras
Copy link

sormuras commented Jun 14, 2017

Gradle 4.0 works with JDK 9 at JUnit 5 -- when you set the JDK_JAVA_OPTIONS to --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED

When you set to --permit-illegal-access, it might lead out of memory exceptions. This is fixed in a yet to be released JDK version. See https://bugs.openjdk.java.net/browse/JDK-8180488

When the "kill switch" is the default, those problems will resurface with JDK 10. 🎱

Please try the latest 4.1 nightly.

Does 4.1 set the "add-opens" flag automatically?

snicoll added a commit to spring-projects/spring-boot that referenced this issue Jun 15, 2017
This commit fixes the build of the gradle plugin with Java 9.

See gradle/gradle#1095
snicoll added a commit to spring-projects/spring-boot that referenced this issue Jul 28, 2017
This commit fixes the build of the gradle plugin with Java 9.

See gradle/gradle#1095
snicoll added a commit to spring-projects/spring-boot that referenced this issue Aug 14, 2017
This commit fixes the build of the gradle plugin with Java 9.

See gradle/gradle#1095
@ghost
Copy link

ghost commented Sep 15, 2017

The final JDK 9 build (b181) defaults to having all packages opened. All workarounds to use --add-opens are no longer needed. However, a warning is still printed during the gradle code execution and it should be fixed.
The warning in worker.org.gradle.internal.reflect.JavaMethod
is tracked by #890

@aalmiray
Copy link
Contributor

Sadly that's not the case in my experience. Running Gradle 4.2 with Java 9 results in an error

* Where:
Build file '/Users/aalmiray/dev/github/griffon/build.gradle' line: 305

* What went wrong:
A problem occurred evaluating root project 'griffon'.
> A problem occurred configuring project ':sample-javafx-kotlin'.
   > Failed to notify project evaluation listener.
      > javax/xml/bind/DatatypeConverter

Neither settings JDK_JAVA_OPTIONS="--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED" nor its equivalent setting in ~/.gradle/gradle.properties via org.gradle.jvmargs seem to work. Environment is set to

------------------------------------------------------------
Gradle 4.2
------------------------------------------------------------

Build time:   2017-09-20 14:48:23 UTC
Revision:     5ba503cc17748671c83ce35d7da1cffd6e24dfbd

Groovy:       2.4.11
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          9 (Oracle Corporation 9+181)
OS:           Mac OS X 10.12.5 x86_64

Steps to reproduce:

@ghost
Copy link

ghost commented Sep 22, 2017

This is a case where the classes are hidden by default.
You will need to run with JDK_JAVA_OPTIONS="--add-modules java.xml.bind"

Also see
https://discuss.gradle.org/t/gradle-does-not-honor-add-modules-jvm-argument-in-jdk9/20403

@oehme
Copy link
Contributor

oehme commented Oct 5, 2018

Closing as outdated, these illegal accesses have been removed.

@oehme oehme closed this as completed Oct 5, 2018
wolfs pushed a commit that referenced this issue Feb 8, 2019
Add build cache configuration to the build
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests