aboutsummaryrefslogtreecommitdiffstats
path: root/bundle-plugin
diff options
context:
space:
mode:
authorgjoranv <gjoranv@gmail.com>2023-10-02 13:16:56 +0200
committergjoranv <gjoranv@gmail.com>2023-10-02 22:15:32 +0200
commit39a9045c54a645fc58fce44817ef5b26531704df (patch)
tree086a724d51413e2c921062c4adab55be722b7b5c /bundle-plugin
parent9f846510fcbd73285e87df0404c8477e66c836d5 (diff)
Fail if project class files are built for JDK version > 17.
- Skip checking compile scoped deps, as they must be compatible with the project's target version. The dependencies could also be multi-release jars containing newer class files.
Diffstat (limited to 'bundle-plugin')
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java17
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java11
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/AbstractGenerateOsgiManifestMojo.java2
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateOsgiManifestMojo.java2
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateTestBundleOsgiManifestMojo.java2
5 files changed, 25 insertions, 9 deletions
diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java
index 4fd8e936f3d..515562eb423 100644
--- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java
+++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java
@@ -18,24 +18,31 @@ import java.util.Optional;
*
* @author Tony Vaagenes
* @author ollivir
+ * @author gjoranv
*/
public class Analyze {
+ public enum JdkVersionCheck {
+ ENABLED,
+ DISABLED
+ }
+
+
static ClassFileMetaData analyzeClass(File classFile) {
- return analyzeClass(classFile, null);
+ return analyzeClass(classFile, null, JdkVersionCheck.DISABLED);
}
- public static ClassFileMetaData analyzeClass(File classFile, ArtifactVersion artifactVersion) {
+ public static ClassFileMetaData analyzeClass(File classFile, ArtifactVersion artifactVersion, JdkVersionCheck jdkVersionCheck) {
try {
- return analyzeClass(new FileInputStream(classFile), artifactVersion);
+ return analyzeClass(new FileInputStream(classFile), artifactVersion, jdkVersionCheck);
} catch (Exception e) {
throw new RuntimeException("An error occurred when analyzing " + classFile.getPath(), e);
}
}
- public static ClassFileMetaData analyzeClass(InputStream inputStream, ArtifactVersion artifactVersion) {
+ public static ClassFileMetaData analyzeClass(InputStream inputStream, ArtifactVersion artifactVersion, JdkVersionCheck jdkVersionCheck) {
try {
- AnalyzeClassVisitor visitor = new AnalyzeClassVisitor(artifactVersion);
+ AnalyzeClassVisitor visitor = new AnalyzeClassVisitor(artifactVersion, jdkVersionCheck);
new ClassReader(inputStream).accept(visitor, ClassReader.SKIP_DEBUG);
return visitor.result();
} catch (IOException e) {
diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java
index 310527e9254..9d5bd280564 100644
--- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java
+++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java
@@ -2,6 +2,7 @@
package com.yahoo.container.plugin.classanalysis;
import com.yahoo.api.annotations.PublicApi;
+import com.yahoo.container.plugin.classanalysis.Analyze.JdkVersionCheck;
import com.yahoo.osgi.annotation.ExportPackage;
import com.yahoo.osgi.annotation.Version;
import org.apache.maven.artifact.versioning.ArtifactVersion;
@@ -23,6 +24,7 @@ import java.util.Set;
*
* @author Tony Vaagenes
* @author ollivir
+ * @author gjoranv
*/
class AnalyzeClassVisitor extends ClassVisitor implements ImportCollector {
@@ -32,10 +34,12 @@ class AnalyzeClassVisitor extends ClassVisitor implements ImportCollector {
private boolean isPublicApi = false;
private final Optional<ArtifactVersion> defaultExportPackageVersion;
+ private final JdkVersionCheck jdkVersionCheck;
- AnalyzeClassVisitor(ArtifactVersion defaultExportPackageVersion) {
+ AnalyzeClassVisitor(ArtifactVersion defaultExportPackageVersion, JdkVersionCheck jdkVersionCheck) {
super(Opcodes.ASM9);
this.defaultExportPackageVersion = Optional.ofNullable(defaultExportPackageVersion);
+ this.jdkVersionCheck = jdkVersionCheck;
}
@Override
@@ -73,6 +77,11 @@ class AnalyzeClassVisitor extends ClassVisitor implements ImportCollector {
this.name = Analyze.internalNameToClassName(name)
.orElseThrow(() -> new RuntimeException("Unable to resolve class name for " + name));
+ if (version > Opcodes.V17 && jdkVersionCheck == JdkVersionCheck.ENABLED) {
+ var jdkVersion = version - 44;
+ throw new RuntimeException("Class " + name + " is compiled for Java version " + jdkVersion + ", but only Java 17 is supported");
+ }
+
addImportWithInternalName(superName);
Arrays.asList(interfaces).forEach(this::addImportWithInternalName);
diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/AbstractGenerateOsgiManifestMojo.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/AbstractGenerateOsgiManifestMojo.java
index e5b9938cdb4..73fcb237d18 100644
--- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/AbstractGenerateOsgiManifestMojo.java
+++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/AbstractGenerateOsgiManifestMojo.java
@@ -206,7 +206,7 @@ abstract class AbstractGenerateOsgiManifestMojo extends AbstractMojo {
private static ClassFileMetaData analyzeClass(JarFile jarFile, JarEntry entry, ArtifactVersion version) throws MojoExecutionException {
try {
- return Analyze.analyzeClass(jarFile.getInputStream(entry), version);
+ return Analyze.analyzeClass(jarFile.getInputStream(entry), version, Analyze.JdkVersionCheck.DISABLED);
} catch (Exception e) {
throw new MojoExecutionException(
String.format("While analyzing the class '%s' in jar file '%s'", entry.getName(), jarFile.getName()), e);
diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateOsgiManifestMojo.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateOsgiManifestMojo.java
index c86d5bda800..9b3313d71ce 100644
--- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateOsgiManifestMojo.java
+++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateOsgiManifestMojo.java
@@ -337,7 +337,7 @@ public class GenerateOsgiManifestMojo extends AbstractGenerateOsgiManifestMojo {
List<ClassFileMetaData> analyzedClasses = allDescendantFiles(outputDirectory)
.filter(file -> file.getName().endsWith(".class"))
- .map(classFile -> Analyze.analyzeClass(classFile, artifactVersionOrNull(bundleVersion)))
+ .map(classFile -> Analyze.analyzeClass(classFile, artifactVersionOrNull(bundleVersion), Analyze.JdkVersionCheck.ENABLED))
.toList();
return PackageTally.fromAnalyzedClassFiles(analyzedClasses);
diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateTestBundleOsgiManifestMojo.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateTestBundleOsgiManifestMojo.java
index 9ee658ddc22..f1452d5e563 100644
--- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateTestBundleOsgiManifestMojo.java
+++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateTestBundleOsgiManifestMojo.java
@@ -77,7 +77,7 @@ public class GenerateTestBundleOsgiManifestMojo extends AbstractGenerateOsgiMani
return Stream.concat(allDescendantFiles(new File(project.getBuild().getOutputDirectory())),
allDescendantFiles(new File(project.getBuild().getTestOutputDirectory())))
.filter(file -> file.getName().endsWith(".class"))
- .map(classFile -> Analyze.analyzeClass(classFile, null))
+ .map(classFile -> Analyze.analyzeClass(classFile, null, Analyze.JdkVersionCheck.DISABLED))
.toList();
}