[Git][java-team/gradle][master] 2 commits: Fix OpenJDK 8 compatibility (Closes: #925225)
Emmanuel Bourg
gitlab at salsa.debian.org
Tue Jun 25 10:37:03 BST 2019
Emmanuel Bourg pushed to branch master at Debian Java Maintainers / gradle
Commits:
be3acc2b by Tiago Stürmer Daitx at 2019-06-21T22:53:08Z
Fix OpenJDK 8 compatibility (Closes: #925225)
- - - - -
47973ee2 by Jongmin Kim at 2019-06-25T09:34:41Z
Use JRE provided xml-apis (Closes: #925586)
- - - - -
5 changed files:
- debian/changelog
- debian/control
- debian/patches/java11-compatibility.patch
- debian/patches/java8-compatibility.patch
- debian/patches/use-local-artifacts.patch
Changes:
=====================================
debian/changelog
=====================================
@@ -1,3 +1,23 @@
+gradle (4.4.1-7) UNRELEASED; urgency=medium
+
+ * Use JRE provided xml-apis (Closes: #925586)
+
+ -- Jongmin Kim <jmkim at pukyong.ac.kr> Tue, 25 Jun 2019 11:32:22 +0200
+
+gradle (4.4.1-6) unstable; urgency=medium
+
+ [ Tiago Stürmer Daitx ]
+ * Fix OpenJDK 8 compatibility: (Closes: #925225)
+ - debian/patches/java8-compatibility.patch: cast ByteBuffer to Buffer
+ in org.gradle.internal.hash.Hashing to prevent NoSuchMethodError
+ exception.
+ - debian/patches/java11-compatibility.patch: copy upstream commit for
+ "Use Lookup to invoke defineClass on Java 9+ (#4976)" instead using
+ the previous partial backport to enable both OpenJDK 8 and 11 support.
+ * debian/control: revert gradle Depends back to java 8
+
+ -- Emmanuel Bourg <ebourg at apache.org> Sat, 22 Jun 2019 00:52:47 +0200
+
gradle (4.4.1-5) unstable; urgency=medium
* Team upload.
=====================================
debian/control
=====================================
@@ -40,7 +40,6 @@ Build-Depends: ant,
libjarjar-java,
libjatl-java,
libjaxen-java,
- libjaxp1.3-java,
libjcifs-java,
libjcip-annotations-java,
libjgit-java,
@@ -76,7 +75,7 @@ Homepage: https://gradle.org
Package: gradle
Architecture: all
-Depends: default-jre-headless (>= 2:1.9) | java9-runtime-headless,
+Depends: default-jre-headless (>= 2:1.8) | java8-runtime-headless,
libgradle-core-java (>= ${binary:Version}),
libgradle-plugins-java (>= ${binary:Version}),
${misc:Depends}
=====================================
debian/patches/java11-compatibility.patch
=====================================
@@ -4,51 +4,238 @@ Origin: backport, https://github.com/gradle/gradle/commit/ac15612d41b43c39c8e39d
https://github.com/gradle/gradle/commit/3db6e256987053171178aa96a0ef46caedc8d1a4
--- a/subprojects/base-services/src/main/java/org/gradle/internal/classloader/ClassLoaderUtils.java
+++ b/subprojects/base-services/src/main/java/org/gradle/internal/classloader/ClassLoaderUtils.java
-@@ -24,6 +24,9 @@
+@@ -15,51 +15,41 @@
+ */
+ package org.gradle.internal.classloader;
+
++import org.gradle.api.JavaVersion;
+ import org.gradle.internal.Cast;
+ import org.gradle.internal.UncheckedException;
+ import org.gradle.internal.concurrent.CompositeStoppable;
+ import org.gradle.internal.reflect.JavaMethod;
+-import org.gradle.internal.reflect.JavaReflectionUtil;
+-import sun.misc.Unsafe;
import javax.annotation.Nullable;
import java.io.IOException;
+-import java.lang.reflect.Field;
+-import java.net.MalformedURLException;
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodType;
- import java.lang.reflect.Field;
- import java.net.MalformedURLException;
import java.net.URL;
-@@ -31,16 +34,15 @@
-
- public abstract class ClassLoaderUtils {
+ import java.net.URLConnection;
+-public abstract class ClassLoaderUtils {
+-
- private static final Unsafe UNSAFE;
-+ private static MethodHandle defineClassMethodHandle;
-
- static {
- try {
+-
+- static {
+- try {
- Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
- theUnsafe.setAccessible(true);
- UNSAFE = (Unsafe) theUnsafe.get(null);
- } catch (NoSuchFieldException e) {
- throw new RuntimeException(e);
- } catch (IllegalAccessException e) {
-+ MethodHandles.Lookup baseLookup = MethodHandles.lookup();
-+ MethodType defineClassMethodType = MethodType.methodType(Class.class, new Class[]{String.class, byte[].class, int.class, int.class});
-+ MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(ClassLoader.class, baseLookup);
-+ defineClassMethodHandle = lookup.findVirtual(ClassLoader.class, "defineClass", defineClassMethodType);
-+ } catch (Throwable e) {
- throw new RuntimeException(e);
+- throw new RuntimeException(e);
+- }
+- }
++import static org.gradle.internal.reflect.JavaReflectionUtil.method;
++import static org.gradle.internal.reflect.JavaReflectionUtil.staticMethod;
+
++public abstract class ClassLoaderUtils {
++ private static final ClassDefiner CLASS_DEFINER;
+ private static final JavaMethod<ClassLoader, Package[]> GET_PACKAGES_METHOD;
+ private static final JavaMethod<ClassLoader, Package> GET_PACKAGE_METHOD;
+
+ static {
++ CLASS_DEFINER = JavaVersion.current().isJava9Compatible() ? new LookupClassDefiner() : new ReflectionClassDefiner();
+ GET_PACKAGES_METHOD = getMethodWithFallback(Package[].class, new Class[0], "getDefinedPackages", "getPackages");
+- GET_PACKAGE_METHOD = getMethodWithFallback(Package.class, new Class[] {String.class}, "getDefinedPackage", "getPackage");
++ GET_PACKAGE_METHOD = getMethodWithFallback(Package.class, new Class[]{String.class}, "getDefinedPackage", "getPackage");
+ }
+
+ private static <T> JavaMethod<ClassLoader, T> getMethodWithFallback(Class<T> clazz, Class<?>[] params, String firstChoice, String fallback) {
+ JavaMethod<ClassLoader, T> method;
+ try {
+- method = JavaReflectionUtil.method(ClassLoader.class, clazz, firstChoice, params);
++ method = method(ClassLoader.class, clazz, firstChoice, params);
+ } catch (Throwable e) {
+ // We must not be on Java 9 where the getDefinedPackages() method exists. Fall back to getPackages()
+- method = JavaReflectionUtil.method(ClassLoader.class, clazz, fallback, params);
++ method = method(ClassLoader.class, clazz, fallback, params);
}
+ return method;
}
-@@ -101,6 +103,10 @@
+@@ -85,8 +75,6 @@ public static void disableUrlConnectionCaching() {
+ URL url = new URL("jar:file://valid_jar_url_syntax.jar!/");
+ URLConnection urlConnection = url.openConnection();
+ urlConnection.setDefaultUseCaches(false);
+- } catch (MalformedURLException e) {
+- throw UncheckedException.throwAsUncheckedException(e);
+ } catch (IOException e) {
+ throw UncheckedException.throwAsUncheckedException(e);
+ }
+@@ -101,6 +89,63 @@ public static void disableUrlConnectionCaching() {
}
public static <T> Class<T> define(ClassLoader targetClassLoader, String className, byte[] clazzBytes) {
- return Cast.uncheckedCast(UNSAFE.defineClass(className, clazzBytes, 0, clazzBytes.length, targetClassLoader, null));
-+ try {
-+ return (Class) defineClassMethodHandle.bindTo(targetClassLoader).invokeWithArguments(className, clazzBytes, 0, clazzBytes.length);
-+ } catch (Throwable e) {
-+ throw new RuntimeException(e);
++ return CLASS_DEFINER.defineClass(targetClassLoader, className, clazzBytes);
++ }
++
++ private interface ClassDefiner {
++ <T> Class<T> defineClass(ClassLoader classLoader, String className, byte[] classBytes);
++ }
++
++ private static class ReflectionClassDefiner implements ClassDefiner {
++ private final JavaMethod<ClassLoader, Class> defineClassMethod;
++
++ private ReflectionClassDefiner() {
++ defineClassMethod = method(ClassLoader.class, Class.class, "defineClass", String.class, byte[].class, int.class, int.class);
++ }
++
++ @Override
++ public <T> Class<T> defineClass(ClassLoader classLoader, String className, byte[] classBytes) {
++ return Cast.uncheckedCast(defineClassMethod.invoke(classLoader, className, classBytes, 0, classBytes.length));
++ }
++ }
++
++ private static class LookupClassDefiner implements ClassDefiner {
++ private final Class methodHandlesLookupClass;
++ private final JavaMethod methodHandlesLookup;
++ private final JavaMethod methodHandlesPrivateLookupIn;
++ private final JavaMethod lookupFindVirtual;
++ private final MethodType defineClassMethodType;
++
++ private LookupClassDefiner() {
++ try {
++ methodHandlesLookupClass = Class.forName("java.lang.invoke.MethodHandles$Lookup");
++ } catch (ClassNotFoundException e) {
++ throw new RuntimeException(e);
++ }
++ methodHandlesLookup = staticMethod(MethodHandles.class, methodHandlesLookupClass, "lookup");
++ methodHandlesPrivateLookupIn = staticMethod(MethodHandles.class, methodHandlesLookupClass, "privateLookupIn", Class.class, methodHandlesLookupClass);
++ lookupFindVirtual = method(methodHandlesLookupClass, MethodHandle.class, "findVirtual", Class.class, String.class, MethodType.class);
++ defineClassMethodType = MethodType.methodType(Class.class, new Class[]{String.class, byte[].class, int.class, int.class});
++ }
++
++ /*
++ This method is equivalent to the following code but use reflection to compile on Java 7:
++
++ MethodHandles.Lookup baseLookup = MethodHandles.lookup();
++ MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(ClassLoader.class, baseLookup);
++ MethodHandle defineClassMethodHandle = lookup.findVirtual(ClassLoader.class, "defineClass", defineClassMethodType);
++ handle.bindTo(classLoader).invokeWithArguments(className, classBytes, 0, classBytes.length));
++ */
++ @Override
++ public <T> Class<T> defineClass(ClassLoader classLoader, String className, byte[] classBytes) {
++ Object baseLookup = methodHandlesLookup.invoke(null);
++ Object lookup = methodHandlesPrivateLookupIn.invoke(null, ClassLoader.class, baseLookup);
++ MethodHandle defineClassMethodHandle = (MethodHandle) lookupFindVirtual.invoke(lookup, ClassLoader.class, "defineClass", defineClassMethodType);
++ try {
++ return Cast.uncheckedCast(defineClassMethodHandle.bindTo(classLoader).invokeWithArguments(className, classBytes, 0, classBytes.length));
++ } catch (Throwable throwable) {
++ throw new RuntimeException(throwable);
++ }
+ }
}
}
+diff --git a/subprojects/core/src/main/java/org/gradle/process/internal/worker/child/WorkerProcessClassPathProvider.java b/subprojects/core/src/main/java/org/gradle/process/internal/worker/child/WorkerProcessClassPathProvider.java
+index 9a7fd911c78f..c1324a04fef5 100644
+--- a/subprojects/core/src/main/java/org/gradle/process/internal/worker/child/WorkerProcessClassPathProvider.java
++++ b/subprojects/core/src/main/java/org/gradle/process/internal/worker/child/WorkerProcessClassPathProvider.java
+@@ -18,6 +18,7 @@
+
+ import org.gradle.api.Action;
+ import org.gradle.api.GradleException;
++import org.gradle.api.JavaVersion;
+ import org.gradle.api.internal.ClassPathProvider;
+ import org.gradle.api.specs.Spec;
+ import org.gradle.cache.CacheRepository;
+@@ -57,7 +58,9 @@
+ import java.io.InputStream;
+ import java.net.URL;
+ import java.util.Arrays;
++import java.util.HashSet;
+ import java.util.List;
++import java.util.Set;
+ import java.util.zip.ZipEntry;
+ import java.util.zip.ZipOutputStream;
+
+@@ -116,32 +119,9 @@ public void execute(PersistentCache cache) {
+ try {
+ File jarFile = jarFile(cache);
+ LOGGER.debug("Generating worker process classes to {}.", jarFile);
+-
+- // TODO - calculate this list of classes dynamically
+- List<Class<?>> classes = Arrays.asList(
+- GradleWorkerMain.class,
+- BootstrapSecurityManager.class,
+- EncodedStream.EncodedInput.class,
+- ClassLoaderUtils.class,
+- FilteringClassLoader.class,
+- FilteringClassLoader.Spec.class,
+- ClassLoaderHierarchy.class,
+- ClassLoaderVisitor.class,
+- ClassLoaderSpec.class,
+- SystemClassLoaderSpec.class,
+- JavaReflectionUtil.class,
+- JavaMethod.class,
+- GradleException.class,
+- NoSuchPropertyException.class,
+- NoSuchMethodException.class,
+- UncheckedException.class,
+- PropertyAccessor.class,
+- PropertyMutator.class,
+- Factory.class,
+- Spec.class);
+ ZipOutputStream outputStream = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(jarFile)));
+ try {
+- for (Class<?> classToMap : classes) {
++ for (Class<?> classToMap : getClassesForWorkerJar()) {
+ remapClass(classToMap, outputStream);
+ }
+ } finally {
+@@ -152,6 +132,37 @@ public void execute(PersistentCache cache) {
+ }
+ }
+
++ private Set<Class<?>> getClassesForWorkerJar() {
++ // TODO - calculate this list of classes dynamically
++ List<Class<?>> classes = Arrays.asList(
++ GradleWorkerMain.class,
++ BootstrapSecurityManager.class,
++ EncodedStream.EncodedInput.class,
++ ClassLoaderUtils.class,
++ FilteringClassLoader.class,
++ ClassLoaderHierarchy.class,
++ ClassLoaderVisitor.class,
++ ClassLoaderSpec.class,
++ SystemClassLoaderSpec.class,
++ JavaReflectionUtil.class,
++ JavaMethod.class,
++ GradleException.class,
++ NoSuchPropertyException.class,
++ NoSuchMethodException.class,
++ UncheckedException.class,
++ PropertyAccessor.class,
++ PropertyMutator.class,
++ Factory.class,
++ Spec.class,
++ JavaVersion.class);
++ Set<Class<?>> result = new HashSet<Class<?>>(classes);
++ for (Class<?> klass : classes) {
++ result.addAll(Arrays.asList(klass.getDeclaredClasses()));
++ }
++
++ return result;
++ }
++
+ private void remapClass(Class<?> classToMap, ZipOutputStream jar) throws IOException {
+ String internalName = Type.getInternalName(classToMap);
+ String resourceName = internalName.concat(".class");
--- a/subprojects/base-services/src/main/java/org/gradle/api/JavaVersion.java
+++ b/subprojects/base-services/src/main/java/org/gradle/api/JavaVersion.java
@@ -17,25 +17,26 @@
=====================================
debian/patches/java8-compatibility.patch
=====================================
@@ -74,3 +74,14 @@ Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gradle/+bug/1760359
return charbuffer;
}
+--- a/subprojects/base-services/src/main/java/org/gradle/internal/hash/Hashing.java
++++ b/subprojects/base-services/src/main/java/org/gradle/internal/hash/Hashing.java
+@@ -158,7 +158,7 @@ public class Hashing {
+ private void update(int length) {
+ checkNotDone();
+ digest.update(buffer.array(), 0, length);
+- buffer.clear();
++ ((java.nio.Buffer) buffer).clear();
+ }
+
+ @Override
=====================================
debian/patches/use-local-artifacts.patch
=====================================
@@ -7,17 +7,15 @@ Subject: use local artifacts
to patch some artifact names here.
Forwarded: not-needed
---
- build.gradle | 4 +--
- buildSrc/build.gradle | 7 ++--
- gradle/dependencies.gradle | 42 +++++++++++-----------
- gradle/testSetup.gradle | 2 +-
- .../dependency-management.gradle | 5 ---
- subprojects/docs/docs.gradle | 15 ++------
- subprojects/javascript/javascript.gradle | 2 +-
- subprojects/maven/maven.gradle | 2 +-
- subprojects/reporting/reporting.gradle | 2 +-
- .../testing/worker/ForkingTestClassProcessor.java | 4 +--
- 10 files changed, 35 insertions(+), 50 deletions(-)
+ build.gradle | 5 --
+ buildSrc/build.gradle | 8 +--
+ gradle/dependencies.gradle | 21 ++++++----
+ subprojects/build-init/build-init.gradle | 1
+ subprojects/core/core.gradle | 1
+ .../dependency-management.gradle | 5 --
+ subprojects/reporting/reporting.gradle | 2
+ .../testing/worker/ForkingTestClassProcessor.java | 2
+ 8 files changed, 22 insertions(+), 23 deletions(-)
--- a/build.gradle
+++ b/build.gradle
@@ -78,7 +76,7 @@ Forwarded: not-needed
kryo: 'com.esotericsoftware.kryo:kryo:2.20',
jsr305: 'com.google.code.findbugs:jsr305:1.3.9 at jar',
groovy: "org.codehaus.groovy:groovy-all:${versions.groovy}",
-@@ -102,7 +102,7 @@
+@@ -102,11 +102,10 @@
equalsVerifier: 'nl.jqno.equalsverifier:equalsverifier:2.1.6',
xbean: 'org.apache.xbean:xbean-reflect:3.4 at jar', //required by maven3 classes
nativePlatform: 'net.rubygrapefruit:native-platform:0.14',
@@ -87,7 +85,11 @@ Forwarded: not-needed
xerces: "xerces:xercesImpl:2.11.0",
objenesis: 'org.objenesis:objenesis:1.2 at jar',
jsoup: 'org.jsoup:jsoup:1.6.3',
-@@ -157,7 +157,7 @@
+- xmlApis: 'xml-apis:xml-apis:1.4.01',
+ jgit: [
+ 'org.eclipse.jgit:org.eclipse.jgit:4.5.3.201708160445-r at jar', // 4.6+ requires Java 8
+ libraries.commons_httpclient,
+@@ -157,7 +156,7 @@
dependency 'org.apache.maven.wagon:wagon-file:2.4 at jar'
dependency 'org.apache.maven.wagon:wagon-http:2.4 at jar'
dependency 'org.apache.maven.wagon:wagon-provider-api:2.4 at jar'
@@ -96,7 +98,7 @@ Forwarded: not-needed
//eather:
dependency 'org.apache.maven.resolver:maven-resolver-api:1.13.1 at jar'
-@@ -200,8 +200,8 @@
+@@ -200,8 +199,8 @@
dependency libraries.mina
}
@@ -107,7 +109,7 @@ Forwarded: not-needed
dependency libraries.bouncycastle_provider
}
-@@ -252,3 +252,11 @@
+@@ -252,3 +251,11 @@
}
}
}
@@ -119,6 +121,16 @@ Forwarded: not-needed
+ apply from: "${rootDir}/../debian/substituteDependencies.gradle"
+ }
+}
+--- a/subprojects/core/core.gradle
++++ b/subprojects/core/core.gradle
+@@ -55,7 +55,6 @@
+ implementation libraries.jcip
+ implementation libraries.nativePlatform
+ implementation libraries.commons_compress
+- implementation libraries.xmlApis
+
+ runtimeOnly project(":docs")
+
--- a/subprojects/dependency-management/dependency-management.gradle
+++ b/subprojects/dependency-management/dependency-management.gradle
@@ -6,11 +6,6 @@
View it on GitLab: https://salsa.debian.org/java-team/gradle/compare/9a3b7ebb9f4365afc4bd442cab0de97afa07ef30...47973ee2bc76eaf20b1f7368422b71bc4fcd8a79
--
View it on GitLab: https://salsa.debian.org/java-team/gradle/compare/9a3b7ebb9f4365afc4bd442cab0de97afa07ef30...47973ee2bc76eaf20b1f7368422b71bc4fcd8a79
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-java-commits/attachments/20190625/345b3282/attachment.html>
More information about the pkg-java-commits
mailing list