通配符:由于使用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();
}