java - 使用 Files.createSymbolicLink() 方法创建符号链接时抛出 NoSuchFileException
问题描述
我在这里创建了一个 gradle 项目来试验符号链接的创建。我编写了一个 gradle 任务runScript,它依次执行一个 groovy 脚本myscript.groovy ,该脚本具有创建符号链接的逻辑。
注意: valid_symlink分支使用 SNIPPET 1而invalid_symlink使用SNIPPET 2。因此,无需取消注释 SNIPPETS 并运行任务,您只需切换到相应的分支并运行任务即可。
使用 myscript.groovy 的 SNIPPET 1
每当我尝试通过取消注释 myscript.groovy 中的 SNIPPET 1 来执行任务runScript时(在 master 分支中时),我可以看到在 symlinkTEstFiles 目录下成功创建了符号链接,但 gradle 构建失败并出现以下异常:
Exception in thread "main" java.nio.file.NoSuchFileException: D:\git-repos\test-cloning-symlink-demo-mcve\symlink-demo-mcve\..\..\..\symlinkTestFiles\toSymlink.groovy
at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
at sun.nio.fs.WindowsFileSystemProvider.createSymbolicLink(WindowsFileSystemProvider.java:585)
at java.nio.file.Files.createSymbolicLink(Files.java:1043)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.invoke(StaticMetaMethodSite.java:46)
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.call(StaticMetaMethodSite.java:91)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:136)
at myscript.run(myscript.groovy:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1225)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034)
at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:947)
at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:930)
at org.codehaus.groovy.runtime.InvokerHelper.runScript(InvokerHelper.java:428)
at org.codehaus.groovy.runtime.InvokerHelper$runScript.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:136)
at myscript.main(myscript.groovy)
FAILURE: Build failed with an exception.
使用 myscript.groovy 的 SNIPPET 2
通过取消注释 SNIPPET 2(在 master 分支中时)运行 gradle task runScript 不会创建符号链接,并且构建失败并出现以下 esxception :
Exception in thread "main" java.nio.file.NoSuchFileException: ..\..\..\symlinkTestFiles\toSymlink.groovy
at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
at sun.nio.fs.WindowsFileSystemProvider.createSymbolicLink(WindowsFileSystemProvider.java:585)
at java.nio.file.Files.createSymbolicLink(Files.java:1043)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.invoke(StaticMetaMethodSite.java:46)
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.call(StaticMetaMethodSite.java:91)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:136)
at myscript.run(myscript.groovy:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1225)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1034)
at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:947)
at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:930)
at org.codehaus.groovy.runtime.InvokerHelper.runScript(InvokerHelper.java:428)
at org.codehaus.groovy.runtime.InvokerHelper$runScript.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:136)
at myscript.main(myscript.groovy)
我只是无法弄清楚异常的原因。我的代码有什么问题?如果我只执行 myscript.groovy,我不会得到任何异常,并且在两种情况下都会创建符号链接,即 SNIPPET 1 和 SNIPPET 2。但是由 SNippet 2 创建的符号链接不会打开。
为什么我的 groovy 脚本直接执行时运行良好,但通过 gradle 任务执行时抛出异常。
请指导我。
解决方案
推荐阅读
- odoo - 如何将值从销售传递到发票odoo?
- django - 如何合并两个查询集并在 django 中创建新的查询集
- php - 连接到 mySQL 时出错:SQLSTATE[HY093]: Invalid parameter number
- jersey - Jersey 应用程序可以拥有多少个 RootResources 和 SubResources 是否有限制?
- javascript - mongoose 上的数组字段类型的分页不起作用,但适用于 mongo shell
- spring-boot - Spring Boot中的Jetty自定义格式日志模式
- python - adb - 在 android 设备中获取应用程序名称(设置 > 应用程序)#python
- workflow - Alfresco 工作流 api 正在丢失一个变量
- shell - 使用 kubectl 和 pg_dump 将数据库转储下载到本地
- javascript - 在 React JS 中将 PDF 转换为图像 [.JPG]