Java代码获取Maven本地仓库路径时如何屏蔽JAVA_TOOL_OPTIONS输出
解决JAVA_TOOL_OPTIONS干扰Maven本地仓库路径获取的问题
最优方案:直接使用Maven API读取配置
完全绕开命令行执行的方式,通过Maven内置的settings API直接读取本地仓库路径,从根源避免输出干扰。
示例代码:
import org.apache.maven.settings.Settings; import org.apache.maven.settings.building.DefaultSettingsBuilder; import org.apache.maven.settings.building.DefaultSettingsBuilderFactory; import org.apache.maven.settings.building.SettingsBuildingRequest; import org.apache.maven.settings.building.SettingsBuildingResult; import java.io.File; public class MavenLocalRepoGetter { public static String getLocalRepositoryPath() throws Exception { DefaultSettingsBuilder builder = new DefaultSettingsBuilderFactory().newInstance(); SettingsBuildingRequest request = new SettingsBuildingRequest(); // 自动加载用户级和全局级的settings.xml request.setUserSettingsFile(new File(System.getProperty("user.home"), ".m2/settings.xml")); String mavenHome = System.getenv("MAVEN_HOME"); if (mavenHome != null) { request.setGlobalSettingsFile(new File(mavenHome, "conf/settings.xml")); } SettingsBuildingResult result = builder.build(request); return result.getEffectiveSettings().getLocalRepository(); } }
需要在项目中添加Maven settings相关依赖(版本对应你使用的Maven版本):
<dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-settings</artifactId> <version>3.9.6</version> </dependency> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-settings-builder</artifactId> <version>3.9.6</version> </dependency>
次优方案:临时清空命令行的JAVA_TOOL_OPTIONS
针对当前Maven命令临时取消环境变量,不影响系统全局设置。在Windows下构造命令时,先清空变量再执行Maven命令:
Java代码示例:
ProcessBuilder processBuilder = new ProcessBuilder( "cmd.exe", "/c", "set JAVA_TOOL_OPTIONS= && mvn help:evaluate -Dexpression=settings.localRepository -q -DforceStdout" ); processBuilder.redirectErrorStream(true); Process process = processBuilder.start(); // 读取输出流并处理 try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { String repoPath = reader.readLine(); // 使用repoPath }
备选方案:过滤命令行输出
如果上述方案都无法实施,再对输出进行过滤,剔除干扰行:
public static String getCleanRepoPath(String rawOutput) { return rawOutput.lines() .filter(line -> !line.startsWith("Picked up JAVA_TOOL_OPTIONS:")) .filter(line -> !line.isBlank()) .findFirst() .orElseThrow(() -> new IllegalStateException("未找到有效仓库路径")); }
内容的提问来源于stack exchange,提问作者asb
相关产品推荐
相关产品推荐

