配置java comp路径_如何使用通配符将JavaCompiler的类路径设置为...

博客介绍了Java 1.6通配符在javac中的使用,如“javac -cp \lib/*\ Test.java”。指出直接用Java API调用编译器时,源代码无通配符扩展问题,JDK包装二进制文件可扩展通配符。还给出解决办法,包括不建议的Processbuilder调用,以及自己展开通配符的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通配符:由于使用java / javaw / javac时支持Java 1.6通配符,因此更多信息:Windows/Solaris and Linux

例:

javac -cp "lib/*" Test.java

这会将lib目录中的所有.jar文件(不是.class!)用作类路径.这不应与外壳的*扩展混淆. -cp lib / *扩展为无效的参数语法-cp lib / a.jar lib / b.jar.为了避免这种情况,您必须添加引号:-cp“ lib / *”

问题的原因:您试图直接使用Java API从源代码调用Java编译器.此源代码不包含通配符扩展.

JDK附带了一个包装二进制文件(javac,javadoc,javah,javap都是相同的二进制文件),它可以执行一些操作并最终调用编译器任务.该包装程序还会在您的类路径中扩展通配符,因此,编译器任务不再需要这样做(并且不必这样做).请参见Compiler Readme中的“构建->注释->启动器”部分. Launcher sourcecode.

解:

>一个非常差的解决方案是通过Processbuilder调用javac. (不建议这样做,因为它是解决简单问题的复杂且容易出错的解决方案)

>自己展开通配符:

示例代码:

String classpath = buildClassPath("lib/", "test/", "lib/*");

System.out.println(classpath);

// output: lib/;test/;lib/a.jar;lib/b.jar;

此函数接受所有类路径条目并构建一个类路径.带有通配符的类路径条目将被扩展.

/**

* This function builds a classpath from the passed Strings

*

* @param paths classpath elements

* @return returns the complete classpath with wildcards expanded

*/

private static String buildClassPath(String... paths) {

StringBuilder sb = new StringBuilder();

for (String path : paths) {

if (path.endsWith("*")) {

path = path.substring(0, path.length() - 1);

File pathFile = new File(path);

for (File file : pathFile.listFiles()) {

if (file.isFile() && file.getName().endsWith(".jar")) {

sb.append(path);

sb.append(file.getName());

sb.append(System.getProperty("path.separator"));

}

}

} else {

sb.append(path);

sb.append(System.getProperty("path.separator"));

}

}

return sb.toString();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值