@@ -0,0 +1,2 @@ | |||
Generates a modular, multi-release JAR. To regenerate, run `gradle jar`. The output | |||
is `build/libs/IgnoreJava9JarElements.jar`. |
@@ -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' | |||
) | |||
} |
@@ -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."); | |||
} | |||
} |
@@ -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."); | |||
} | |||
} |
@@ -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 { | |||
} |
@@ -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; |
@@ -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()); | |||
} | |||
} | |||
} |
@@ -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 { | |||
@@ -388,15 +389,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()); |