I have the same issue, i want to compile different maven proect with different jdk, but it not works, this is my code
@Override
public void compiler(CompileDTO dto) {
String originalJavaHome = System.getenv("JAVA_HOME");
String originalClasspath = System.getenv("CLASSPATH");
try {
// 设置新的环境变量
String newJavaHome = dto.getJdkPath();
String newClasspath = newJavaHome + "/lib";
if (newJavaHome != null) {
System.setProperty("JAVA_HOME", newJavaHome);
System.setProperty("CLASSPATH", newClasspath);
} else {
throw new ServiceException("JDK路径不正确或无法设置环境变量");
}
String executeAbleCommand = MavenCommand.EXECUTABLE + newJavaHome + "/bin/javac";
String classpathCommand = MavenCommand.CLASSPATH + newJavaHome + "/lib";
MavenCommand.COMMAND.add(executeAbleCommand);
MavenCommand.COMMAND.add(classpathCommand);
log.info("开始编译Maven项目,代码路径: {}, 编译参数: {}", dto.getCodePath(), MavenCommand.COMMAND);
long startTime = System.currentTimeMillis();
File codeFile = new File(dto.getCodePath());
if (!codeFile.exists()) {
throw new ServiceException("代码路径不存在");
}
MavenCli cli = new MavenCli();
System.getProperties().setProperty(MavenCli.MULTIMODULE_PROJECT_DIRECTORY, MavenCli.USER_MAVEN_CONFIGURATION_HOME.getAbsolutePath());
PrintStream originalErrStream = System.err;
PrintStream originalOutStream = System.out;
int statusCode;
try {
statusCode = cli.doMain(MavenCommand.COMMAND.toArray(new String[0]), dto.getCodePath(), System.out, System.err);
} catch (Exception e) {
throw new ServiceException("执行编译命令失败", e);
} finally {
System.setOut(originalOutStream);
System.setErr(originalErrStream);
}
if (statusCode != 0) {
throw new ServiceException("执行编译命令失败, statusCode: " + statusCode);
}
log.info("结束编译Maven项目,编译耗时: {} s", (System.currentTimeMillis() - startTime) / 1000);
} finally {
// 恢复原始的环境变量
if (originalJavaHome != null) {
System.setProperty("JAVA_HOME", originalJavaHome);
} else {
System.clearProperty("JAVA_HOME");
}
if (originalClasspath != null) {
System.setProperty("CLASSPATH", originalClasspath);
} else {
System.clearProperty("CLASSPATH");
}
}
command log:编译参数: [clean, compile, -Dmaven.test.skip=true, --batch-mode, -T 2C, -Dmaven.compiler.executable=/opt/jdk1.8.0_202//bin/javac, -Dmaven.compiler.classpath=/opt/jdk1.8.0_202//lib]
but log error is: Could not find artifact jdk.tools:jdk.tools:jar:1.6 at specified path /usr/lib/jvm/java-11-openjdk-11.0.12.0.7-0.el7_9.x86_64/../lib/tools.jar -> [Help 1]
/usr/lib/jvm/java-11-openjdk-11.0.12.0.7-0.el7_9.x86_64/ is internal jdk path, not my jdk path