Maven toolchains.xml Script
Introduction
Apache Maven引入了Maven工具链,以简化配置插件 并且避免在项目POM中指定任何JDK位置。 可用的 JDK在以下位置配置$ {HOME} /。m2 / 工具链。xml。 本文 引入了脚本来自动生成工具链。xml 文件,工具链。xml。bash。
Theory of Operation
的工具链.xml文件包含一个<toolchain/>每个元素 配置的JDK。
<?xml version="1.0" encoding="UTF-8"?>
<toolchains>
...
<toolchain>
<type>jdk</type>
<provides>
<version>VERSION</version>
<vendor>VENDOR</vendor>
</provides>
<configuration>
<jdkHome>JDKHOMEDIR</jdkHome>
</configuration>
</toolchain>
...
</toolchains>
对于每个JDKHOMEDIR候选人版由JVM指定 系统属性java.specification.version并且一致的供应商名称是 由指定java.vendor。 这个简单的Java程序(与Java兼容 1.5及更高版本)将提供模板。 (JDK目录必须是 作为命令行参数提供。)
public class ToolchainEntry {
public static void main(String[] argv) {
System.out
.format(" <toolchain>\n")
.format(" <type>jdk</type>\n")
.format(" <provides>\n")
.format(" <version>%s</version>\n",
System.getProperty("java.specification.version"))
.format(" <vendor>%s</vendor>\n",
System.getProperty("java.vendor"))
.format(" </provides>\n")
.format(" <configuration>\n")
.format(" <jdkHome>%s</jdkHome>\n", argv[0])
.format(" </configuration>\n")
.format(" </toolchain>\n");
}
}
该程序与重击下一节中的脚本。
Script
一种重击脚本用于驱动所描述的Java程序的执行 在上一节中,负责:
- Identify the candidate JVM directories:
- Mac OS X (Darwin):
/Library/Java/JavaVirtualMachines/*.jdk/Contents/Home
- Linux:
/usr/lib/jvm/*jdk*
- Mac OS X (Darwin):
- Create
Toolchain.java
and compile toToolchain.class
1 - Create a new
<toolchains/>
document and iterate therough each candidate JDK directory executingToolchain.class
with the candidate JVM
1.5,Oracle的JDK 12可以产生的最早代码是1.7。
#!/bin/bash
# $Id: README.md 4598 2019-09-17 05:52:41Z ball $
shopt -s nullglob
JDKS+=({/Library/Java/JavaVirtualMachines/*.jdk/Contents/Home,/usr/lib/jvm/*jdk*})
cat > ToolchainEntry.java <<EOF
public class ToolchainEntry {
public static void main(String[] argv) {
System.out
.format(" <toolchain>\n")
.format(" <type>jdk</type>\n")
.format(" <provides>\n")
.format(" <version>%s</version>\n",
System.getProperty("java.specification.version"))
.format(" <vendor>%s</vendor>\n",
System.getProperty("java.vendor"))
.format(" </provides>\n")
.format(" <configuration>\n")
.format(" <jdkHome>%s</jdkHome>\n", argv[0])
.format(" </configuration>\n")
.format(" </toolchain>\n");
}
}
EOF
javac -Xlint:none -source 1.7 -target 1.7 ToolchainEntry.java
echo '<?xml version="1.0" encoding="UTF-8"?>' > toolchains.xml
echo '<toolchains>' >> toolchains.xml
for jdk in ${JDKS[@]}; do
if [ -d ${jdk} ]; then
java=${jdk}/bin/java
if [ -x ${java} ]; then
${java} ToolchainEntry ${jdk} >> toolchains.xml
fi
fi
done
echo '</toolchains>' >> toolchains.xml
rm -rf ToolchainEntry.*
Output
示例生成工具链.xml的档案Mac OS X和的Linux(谷歌 下面提供了Cloud Shell)。
<?xml version="1.0" encoding="UTF-8"?>
<toolchains>
<toolchain>
<type>jdk</type>
<provides>
<version>10</version>
<vendor>AdoptOpenJDK</vendor>
</provides>
<configuration>
<jdkHome>/Library/Java/JavaVirtualMachines/adoptopenjdk-10.jdk/Contents/Home</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>11</version>
<vendor>AdoptOpenJDK</vendor>
</provides>
<configuration>
<jdkHome>/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>12</version>
<vendor>AdoptOpenJDK</vendor>
</provides>
<configuration>
<jdkHome>/Library/Java/JavaVirtualMachines/adoptopenjdk-12.jdk/Contents/Home</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>1.8</version>
<vendor>AdoptOpenJDK</vendor>
</provides>
<configuration>
<jdkHome>/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>9</version>
<vendor>Oracle Corporation</vendor>
</provides>
<configuration>
<jdkHome>/Library/Java/JavaVirtualMachines/adoptopenjdk-9.jdk/Contents/Home</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>11</version>
<vendor>Amazon.com Inc.</vendor>
</provides>
<configuration>
<jdkHome>/Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>12</version>
<vendor>Oracle Corporation</vendor>
</provides>
<configuration>
<jdkHome>/Library/Java/JavaVirtualMachines/jdk-12.0.2.jdk/Contents/Home</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>1.7</version>
<vendor>Oracle Corporation</vendor>
</provides>
<configuration>
<jdkHome>/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>1.8</version>
<vendor>Oracle Corporation</vendor>
</provides>
<configuration>
<jdkHome>/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>1.8</version>
<vendor>Oracle Corporation</vendor>
</provides>
<configuration>
<jdkHome>/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home</jdkHome>
</configuration>
</toolchain>
</toolchains>
<?xml version="1.0" encoding="UTF-8"?>
<toolchains>
<toolchain>
<type>jdk</type>
<provides>
<version>11</version>
<vendor>Debian</vendor>
</provides>
<configuration>
<jdkHome>/usr/lib/jvm/java-1.11.0-openjdk-amd64</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>11</version>
<vendor>Debian</vendor>
</provides>
<configuration>
<jdkHome>/usr/lib/jvm/java-11-openjdk-amd64</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>1.8</version>
<vendor>Oracle Corporation</vendor>
</provides>
<configuration>
<jdkHome>/usr/lib/jvm/java-1.8.0-openjdk-amd64</jdkHome>
</configuration>
</toolchain>
<toolchain>
<type>jdk</type>
<provides>
<version>1.8</version>
<vendor>Oracle Corporation</vendor>
</provides>
<configuration>
<jdkHome>/usr/lib/jvm/java-8-openjdk-amd64</jdkHome>
</configuration>
</toolchain>
</toolchains>
-
Even though the earliest Java version supported by the java source is ↩