]> source.dussan.org Git - aspectj.git/commitdiff
Fix AspectJ 1.8.x fails with modular and multi-release JARs
authorAndy Clement <aclement@pivotal.io>
Wed, 6 Mar 2019 15:40:20 +0000 (07:40 -0800)
committerAndy Clement <aclement@pivotal.io>
Wed, 6 Mar 2019 15:49:59 +0000 (07:49 -0800)
ajde.core/testdata/IgnoreJava9JarElements/README [new file with mode: 0644]
ajde.core/testdata/IgnoreJava9JarElements/build.gradle [new file with mode: 0644]
ajde.core/testdata/IgnoreJava9JarElements/build/libs/IgnoreJava9JarElements.jar [new file with mode: 0644]
ajde.core/testdata/IgnoreJava9JarElements/src/main/java/org/aspectj/JdkSpecific.java [new file with mode: 0644]
ajde.core/testdata/IgnoreJava9JarElements/src/main/java11/org/aspectj/JdkSpecific.java [new file with mode: 0644]
ajde.core/testdata/IgnoreJava9JarElements/src/main/module-info/module-info.java [new file with mode: 0644]
ajde.core/testsrc/org/aspectj/ajde/core/AjdeCoreTests.java
ajde.core/testsrc/org/aspectj/ajde/core/tests/IgnoreJava9JarElements.java [new file with mode: 0644]
weaver/src/org/aspectj/weaver/bcel/BcelWeaver.java

diff --git a/ajde.core/testdata/IgnoreJava9JarElements/README b/ajde.core/testdata/IgnoreJava9JarElements/README
new file mode 100644 (file)
index 0000000..2993093
--- /dev/null
@@ -0,0 +1,2 @@
+Generates a modular, multi-release JAR. To regenerate, run `gradle jar`. The output
+is `build/libs/IgnoreJava9JarElements.jar`.
diff --git a/ajde.core/testdata/IgnoreJava9JarElements/build.gradle b/ajde.core/testdata/IgnoreJava9JarElements/build.gradle
new file mode 100644 (file)
index 0000000..70ee660
--- /dev/null
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+apply plugin: 'java-library'
+
+if (!JavaVersion.current().isJava11Compatible()) {
+   throw new GradleException("Run with with JDK 11 or newer.")
+}
+
+sourceSets {
+   java11 {
+      java {
+       srcDirs = ['src/main/java11']
+      }
+   }
+   moduleInfo {
+      java {
+         srcDirs = ['src/main/module-info']
+      }
+   }
+}
+
+compileJava {
+   sourceCompatibility = 8
+   targetCompatibility = 8
+}
+
+compileJava11Java {
+   sourceCompatibility = 11
+   targetCompatibility = 11
+}
+
+compileModuleInfoJava {
+   sourceCompatibility = 11
+   targetCompatibility = 11
+}
+
+jar {
+   into('META-INF/versions/11') {
+      from sourceSets.java11.output
+   }
+   into('') {
+      from sourceSets.moduleInfo.output
+   }
+   manifest.attributes(
+      'Multi-Release': 'true',
+      'Main-Class': 'org.aspectj.JdkSpecific'
+   )
+}
diff --git a/ajde.core/testdata/IgnoreJava9JarElements/build/libs/IgnoreJava9JarElements.jar b/ajde.core/testdata/IgnoreJava9JarElements/build/libs/IgnoreJava9JarElements.jar
new file mode 100644 (file)
index 0000000..6347597
Binary files /dev/null and b/ajde.core/testdata/IgnoreJava9JarElements/build/libs/IgnoreJava9JarElements.jar differ
diff --git a/ajde.core/testdata/IgnoreJava9JarElements/src/main/java/org/aspectj/JdkSpecific.java b/ajde.core/testdata/IgnoreJava9JarElements/src/main/java/org/aspectj/JdkSpecific.java
new file mode 100644 (file)
index 0000000..eb4a5fe
--- /dev/null
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.aspectj;
+
+public class JdkSpecific {
+     public static void main(String... args) {
+         System.out.println("This is the Java 8 version of the class.");
+     }
+}
diff --git a/ajde.core/testdata/IgnoreJava9JarElements/src/main/java11/org/aspectj/JdkSpecific.java b/ajde.core/testdata/IgnoreJava9JarElements/src/main/java11/org/aspectj/JdkSpecific.java
new file mode 100644 (file)
index 0000000..c560eea
--- /dev/null
@@ -0,0 +1,15 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.aspectj;
+
+public class JdkSpecific {
+     public static void main(String... args) {
+         System.out.println("This is the Java 11 version of the class.");
+     }
+}
diff --git a/ajde.core/testdata/IgnoreJava9JarElements/src/main/module-info/module-info.java b/ajde.core/testdata/IgnoreJava9JarElements/src/main/module-info/module-info.java
new file mode 100644 (file)
index 0000000..8bee12d
--- /dev/null
@@ -0,0 +1,11 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+module org.aspectj.java9plusjar {
+
+}
index 7e45b47576085bb3aa3f11c6b4d8bb1b3bc0a5c0..f95c7211b20e0dfd5675aed23b4b106e38c16c1e 100644 (file)
@@ -18,6 +18,7 @@ import org.aspectj.ajde.core.tests.AjConfigTests;
 import org.aspectj.ajde.core.tests.BuildCancellingTests;
 import org.aspectj.ajde.core.tests.CompilerMessagesTests;
 import org.aspectj.ajde.core.tests.DuplicateManifestTests;
+import org.aspectj.ajde.core.tests.IgnoreJava9JarElements;
 import org.aspectj.ajde.core.tests.InpathTests;
 import org.aspectj.ajde.core.tests.JarManifestTests;
 import org.aspectj.ajde.core.tests.OutxmlTests;
@@ -48,6 +49,7 @@ public class AjdeCoreTests extends TestCase {
                suite.addTestSuite(JarManifestTests.class);
                suite.addTestSuite(OutxmlTests.class);
                suite.addTestSuite(AjConfigTests.class);
+               suite.addTestSuite(IgnoreJava9JarElements.class);
 
                // $JUnit-END$
                return suite;
diff --git a/ajde.core/testsrc/org/aspectj/ajde/core/tests/IgnoreJava9JarElements.java b/ajde.core/testsrc/org/aspectj/ajde/core/tests/IgnoreJava9JarElements.java
new file mode 100644 (file)
index 0000000..0de4b81
--- /dev/null
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2019 Contributors
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+package org.aspectj.ajde.core.tests;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.jar.Manifest;
+
+import org.aspectj.ajde.core.AjdeCoreTestCase;
+import org.aspectj.ajde.core.TestCompilerConfiguration;
+import org.aspectj.ajde.core.TestMessageHandler;
+
+public class IgnoreJava9JarElements extends AjdeCoreTestCase {
+
+    public static final String injarName = "build/libs/IgnoreJava9JarElements.jar";
+    public static final String outjarName = "outjar.jar";
+
+    private TestMessageHandler handler;
+    private TestCompilerConfiguration compilerConfig;
+
+    protected void setUp() throws Exception {
+        super.setUp();
+        initialiseProject("IgnoreJava9JarElements");
+        handler = (TestMessageHandler) getCompiler().getMessageHandler();
+        compilerConfig = (TestCompilerConfiguration) getCompiler()
+                .getCompilerConfiguration();
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        handler = null;
+        compilerConfig = null;
+    }
+
+    public void testWeave() {
+        Set<File> injars = new HashSet<File>();
+        injars.add(openFile(injarName));
+        compilerConfig.setInpath(injars);
+        Set<File> aspectpath = new HashSet<File>();
+        compilerConfig.setAspectPath(aspectpath);
+        File outjar = openFile(outjarName);
+        compilerConfig.setOutjar(outjar.getAbsolutePath());
+        doBuild(true);
+        assertTrue("Expected no compiler errors or warnings but found "
+                + handler.getMessages(), handler.getMessages().isEmpty());
+        compareManifests(openFile(injarName), openFile(outjarName));
+    }
+
+    private void compareManifests(File inFile, File outFile) {
+
+        try {
+            JarFile inJar = new JarFile(inFile);
+            Manifest inManifest = inJar.getManifest();
+            inJar.close();
+            JarFile outJar = new JarFile(outFile);
+            Manifest outManifest = outJar.getManifest();
+            outJar.close();
+            assertTrue("The manifests in '" + inFile.getCanonicalPath()
+                    + "' and '" + outFile.getCanonicalPath()
+                    + "' sould be the same", inManifest.equals(outManifest));
+        } catch (IOException ex) {
+            fail(ex.toString());
+        }
+    }
+
+}
index 1a66c72b3388ad185705bfe20295998e5f586f2b..93812bbd01915fd5cfbaf783a91c93b88230ab51 100644 (file)
@@ -1,5 +1,5 @@
 /* *******************************************************************
- * Copyright (c) 2002-2010 Contributors
+ * Copyright (c) 2002-2019 Contributors
  * All rights reserved.
  * This program and the accompanying materials are made available
  * under the terms of the Eclipse Public License v1.0
@@ -100,6 +100,7 @@ import org.aspectj.weaver.tools.TraceFactory;
  * @author PARC
  * @author Andy Clement
  * @author Alexandre Vasseur
+ * @author Eric Edens
  */
 public class BcelWeaver {
 
@@ -391,15 +392,23 @@ public class BcelWeaver {
 
                                        while (entries.hasMoreElements()) {
                                                JarEntry entry = (JarEntry) entries.nextElement();
+                                               String filename = entry.getName();
+                                               String filenameLowercase = filename.toLowerCase();
+
+                                               // Ignore class files that Java 8 won't understand (multi-release and module-info)
+                                               if (filenameLowercase.startsWith("meta-inf")
+                                                               || filenameLowercase.endsWith("module-info.class")) {
+                                                       continue;
+                                               }
+
                                                InputStream inStream = inJar.getInputStream(entry);
 
                                                byte[] bytes = FileUtil.readAsByteArray(inStream);
-                                               String filename = entry.getName();
                                                // System.out.println("? addJarFile() filename='" + filename
                                                // + "'");
                                                UnwovenClassFile classFile = new UnwovenClassFile(new File(outDir, filename).getAbsolutePath(), bytes);
 
-                                               if (filename.endsWith(".class")) {
+                                               if (filenameLowercase.endsWith(".class")) {
                                                        ReferenceType type = this.addClassFile(classFile, false);
                                                        StringBuffer sb = new StringBuffer();
                                                        sb.append(inFile.getAbsolutePath());