concordion - Concordion 无法复制资源(突然)
问题描述
有点奇怪,但突然之间(例如,我的验收测试套件运行良好,而我正忙于做一些不相关的*单元测试),当我开始在测试运行中复制资源失败时。
Failed to copy /org/demo/foo/../../../concordion.css to target [Resource: /org/demo/foo/../../../concordion.css]
java.lang.RuntimeException: Failed to copy /org/demo/foo/../../../concordion.css to target [Resource: /org/demo/foo/../../../concordion.css]
at org.concordion.internal.ConcordionBuilder.copyResources(ConcordionBuilder.java:354)
at org.concordion.internal.ConcordionBuilder.build(ConcordionBuilder.java:307)
at org.concordion.internal.FixtureRunner.<init>(FixtureRunner.java:21)
at org.concordion.integration.junit4.ConcordionRunner.<init>(ConcordionRunner.java:62)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:78)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:66)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
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:498)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
at com.sun.proxy.$Proxy1.processTestClass(Unknown Source)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:109)
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:498)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:155)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:137)
at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.FileNotFoundException: /var/folders/wg/3nnv2yf90914pqpx69wmd9cc0000gn/T/concordion/org/demo/foo/../../../concordion.css (No such file or directory)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:162)
at org.concordion.internal.FileTarget.createOutputStream(FileTarget.java:72)
at org.concordion.internal.FileTarget.copyTo(FileTarget.java:35)
at org.concordion.internal.ConcordionBuilder.copyResources(ConcordionBuilder.java:352)
... 43 more
我在 IntelliJ IDEA 和终端运行 gradle 中得到了这个。
我的测试都以类似的东西开始:
@RunWith(ConcordionRunner.class)
@ConcordionResources(value = { "../../../concordion.css" })
public class Index {
}
...并且该.css
文件始终位于其所在的位置(在源代码树中)。在重建之前,我检查了打开的把手并清理了所有东西。文件夹权限似乎很好。有问题的/var
文件夹确实是空的。
有任何想法吗?
*我认为
更新:在 Mac 和 Linux 上,如果您删除/var/folders/../concordion
或/tmp/concordion
(分别),它将重现问题。
解决方案
问题是 Concordion 的FileTarget#createOutputStream(Resource)
方法无法创建OutputStream
用于写入资源的资源。
假设您的夹具在a.b.c
包中,Concordion 正在尝试OutputStream
为该文件创建一个文件"<concordion.output.dir>/a/b/c/../../../concordion.css"
(<concordion.output.dir>
concordion 输出目录在哪里)。如果该"<concordion.output.dir>/a/b/c/"
文件夹尚不存在,则会失败 - Java 似乎不会自动“规范化”删除“ ..
”的路径。
解决方案是规范化路径(可能使用Path.normalize()
)。
要解决此问题,您可以更新到即将推出的 2.2.1 版本,或者使用绝对路径(例如 . @ConcordionResources("/concordion.css")
)。
推荐阅读
- angular - CORS 策略已阻止对 XMLHttpRequest 的访问:请求的资源上不存在“Access-Control-Allow-Origin”标头
- python - VS 代码 - Python 2.7 - 无法导入 matplotlib “import-im6.q16:未授权 `mpl'@error/constitute.c/WriteImage/1037。”
- javascript - 通过本地开发人员的 ChromeDev 工具从实时站点劫持脚本
- r - 读取固定宽度数据:使用标记定位行
- java - 如何区分 application.properties 的路径?
- tensorflow - TensorFlow:如何计算两个张量之间的欧几里得距离?
- c - 是否有任何用于从文本文件中提取子字符串作为结构的 C 函数?
- python - 如何在 python 烧瓶静态中使用角度构建资产?
- ios - 更改已签名 IPA 的捆绑标识符并使用我自己的证书/配置文件辞职
- django - Google App Engine 标准 - ImportError - 异常值:无法导入名称异常