在尝试编译 java 文件时获取 java.nio.file.InvalidPathException: Illegal char <*>

时间:2021-01-04 09:09:37

标签: java powershell batch-file

我是 Java 初学者。我开始了一个临时的 OOP 项目,我正在为其创建一堆不同的包。由于我的项目是 git 跟踪的,我试图在同步之前重新编译所有内容。为了简化通过我的 VS Code Powershell 编译的过程,我创建了一个小的 Windows 批处理脚本 调用 packageUpdater.bat 删除所有以前编译的 java 包,然后应该重新编译所有索引的 java 源:

cd "C:\path\to\project\folder"
del ".\Confrontation\*" ".\Defines\*" ".\WorldBasics\*"
javac -d . ".\sources\Defines\*.java" ".\sources\WorldBasics\*.java" ".\sources\Confrontation\*.java"
pause

我尝试从 Powershell 终端运行 packageUpdater.bat 但后来遇到了这个错误:

<块引用>

C:\path\to\project\folder>javac -d 。 ".\sources\Confrontation*.java"

<块引用>

线程“main”中的异常 java.nio.file.InvalidPathException: Illegal char <*> at index 18: .\sources\Defines*.java 在 java.base/sun.nio.fs.WindowsPathParser.normalize(WindowsPathParser.java:182) 在 java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:153) 在 java.base/sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77) 在 java.base/sun.nio.fs.WindowsPath.parse(WindowsPath.java:92) 在 java.base/sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:229) 在 java.base/java.nio.file.Path.of(Path.java:147) 在 java.base/java.nio.file.Paths.get(Paths.java:69) 在 jdk.compiler/com.sun.tools.javac.main.Option$37.process(Option.java:693) 在 jdk.compiler/com.sun.tools.javac.main.Option.handleOption(Option.java:1088) 在 jdk.compiler/com.sun.tools.javac.main.Arguments.doProcessArgs(Arguments.java:381) 在 jdk.compiler/com.sun.tools.javac.main.Arguments.init(Arguments.java:193) 在 jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:229) 在 jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:170) 在 jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:57) 在 jdk.compiler/com.sun.tools.javac.Main.main(Main.java:43)

删除部分正确执行,我可以验证每个删除操作。而且我知道文件的路径是正确的,因为当我直接在 Powershell 中运行相同的 javac 命令时,它运行没有任何问题。我也是使用批处理文件的新手,所以我想知道我是否做错了什么。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

感谢我收到的关于这个问题的评论,问题似乎出自 cmd 没有预处理我的命令以提供与通配符名称匹配的所有文件,正如我预期的那样。因此java崩溃了,因为它不支持通配符引用。

有人提出了几个解决方案,但我用 Powershell 脚本 packageUpdater.ps1 替换了批处理脚本 packageUpdater.bat。我还修改了脚本以删除更改目录操作,因为现在我可以直接从 vs code powershell 终端中的项目目录运行它。我还用正确的 Powershell 命令替换了我之前脚本中的 UNIX 命令别名:

Remove-Item ".\Confrontation\*",".\Defines\*",".\WorldBasics\*"
javac -d . ".\sources\Defines\*.java", ".\sources\WorldBasics\*.java", ".\sources\Confrontation\*.java"