1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.plugin.internal;
20
21 import javax.inject.Named;
22 import javax.inject.Singleton;
23
24 import org.apache.maven.plugin.MavenPluginPrerequisitesChecker;
25 import org.apache.maven.plugin.descriptor.PluginDescriptor;
26 import org.eclipse.aether.util.version.GenericVersionScheme;
27 import org.eclipse.aether.version.InvalidVersionSpecificationException;
28 import org.eclipse.aether.version.Version;
29 import org.eclipse.aether.version.VersionConstraint;
30 import org.eclipse.aether.version.VersionScheme;
31
32 @Named
33 @Singleton
34 public class MavenPluginJavaPrerequisiteChecker implements MavenPluginPrerequisitesChecker {
35 private final VersionScheme versionScheme = new GenericVersionScheme();
36
37 @Override
38 public void accept(PluginDescriptor pluginDescriptor) {
39 String requiredJavaVersion = pluginDescriptor.getRequiredJavaVersion();
40 if (requiredJavaVersion != null && !requiredJavaVersion.isEmpty()) {
41 String currentJavaVersion = System.getProperty("java.version");
42 if (!matchesVersion(requiredJavaVersion, currentJavaVersion)) {
43 throw new IllegalStateException("Required Java version " + requiredJavaVersion
44 + " is not met by current version: " + currentJavaVersion);
45 }
46 }
47 }
48
49 boolean matchesVersion(String requiredVersion, String currentVersion) {
50 VersionConstraint constraint;
51 try {
52 constraint = versionScheme.parseVersionConstraint(requiredVersion.equals("8") ? "1.8" : requiredVersion);
53 } catch (InvalidVersionSpecificationException e) {
54 throw new IllegalArgumentException("Invalid 'requiredJavaVersion' given in plugin descriptor", e);
55 }
56 Version current;
57 try {
58 current = versionScheme.parseVersion(currentVersion);
59 } catch (InvalidVersionSpecificationException e) {
60 throw new IllegalStateException("Could not parse current Java version", e);
61 }
62 if (constraint.getRange() == null) {
63 return constraint.getVersion().compareTo(current) <= 0;
64 }
65 return constraint.containsVersion(current);
66 }
67 }