2013-05-09 47 views
1

我想通過使用Jar類型的gradle任務分解依賴項jar來創建功能測試的可執行jar。當爆炸黃瓜-jvm.jar時獲取文件權限錯誤

Cucumber-1.1.3是依賴項之一。 我使用gradle這個1.1 JVM 1.6(企業標準)

我得到以下錯誤:

org.gradle.api.GradleException:無法展開ZIP「的/ dev/shm的/ 263985 /變壓器/caches/artifacts-14/filestore/info.cukes/cucumber-java/1.1.3/jar/4b389fbe494942b319518d27ae38571f477967f6/cucumber-java-1.1.3.jar」。 在org.gradle.api.internal.file.archive.ZipFileTree.visit(ZipFileTree.java:97) 在org.gradle.api.internal.file.collections.FileTreeAdapter.visit(FileTreeAdapter.java:96) 在org.gradle.api.internal.file.AbstractFileTree $ FilteredFileTree.visit(AbstractFileTree.java:136) at org.gradle.api.internal.file.AbstractFileTree.getFiles(AbstractFileTree.java:37) at org.gradle。 api.internal.file.CompositeFileCollection.getFiles(CompositeFileCollection.java:39) at org.gradle.api.internal.file.AbstractFileCollection.iterator(AbstractFileCollection.java:60) at org.gradle.api.internal.changedetection。 DefaultFileSnapshotter.snapshot(DefaultFileSnapshotter.java:42) at org.gradle.api.internal.changedetection.InputFilesChangedUpToDateRule.create(In putFilesChangedUpToDateRule.java:35) 在org.gradle.api.internal.changedetection.CompositeUpToDateRule.create(CompositeUpToDateRule.java:35) 在org.gradle.api.internal.changedetection.DefaultTaskArtifactStateRepository $ HistoricExecution.calcCurrentState(DefaultTaskArtifactStateRepository.java: 80) 在org.gradle.api.internal.changedetection.DefaultTaskArtifactStateRepository $ HistoricExecution.isUpToDate(DefaultTaskArtifactStateRepository.java:88) 在org.gradle.api.internal.changedetection.DefaultTaskArtifactStateRepository $ TaskArtifactStateImpl.isUpToDate(DefaultTaskArtifactStateRepository.java:128) at org.gradle.api.internal.changedetection.ShortCircuitTaskArtifactStateRepository $ ShortCircuitArtifactState.isUpToDate(ShortCircuitTaskArtifactStateRepository.java:77) at org.gradle.api.internal.ch angedetection.FileCacheBroadcastTaskArtifactStateRepository $ 1.isUpToDate(FileCacheBroadcastTaskArtifactStateRepository.java:37) 在org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:44) 在org.gradle.api.internal.tasks.execution .ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:57) 在org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:41) 在org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter .execute(SkipTaskWithNoActionsExecuter.java:51) 在org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:52) 在org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute (ExecuteAtMostOnceTaskExec uter.java:42) 在org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:247) 在org.gradle.execution.DefaultTaskGraphExecuter.executeTask(DefaultTaskGraphExecuter.java:192) 在org.gradle。 execution.DefaultTaskGraphExecuter.doExecute(DefaultTaskGraphExecuter.java:177) 在org.gradle.execution.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:83) 在org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:36) 在org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61) at org.gradle.execution.DefaultBuildExecuter.access $ 200(DefaultBuildExecuter。Java的:23) 在org.gradle.execution.DefaultBuildExecuter $ 2.proceed(DefaultBuildExecuter.java:67) 在org.gradle.api.internal.changedetection.TaskCacheLockHandlingBuildExecuter $ 1.run(TaskCacheLockHandlingBuildExecuter.java:31) 的組織。 gradle.cache.internal.DefaultCacheAccess $ 1.create(DefaultCacheAccess.java:111) at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:126) at org.gradle.cache.internal.DefaultCacheAccess.useCache (DefaultCacheAccess.java:109) 在org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:129) 在org.gradle.api.internal.changedetection.DefaultTaskArtifactStateCacheAccess.useCache(DefaultTaskArtifactStateCacheAccess.java:79) 在org.grad le.api.internal.changedetection.TaskCacheLockHandlingBuildExecuter.execute(TaskCacheLockHandlingBuildExecuter.java:29) 在org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61) 在org.gradle.execution.DefaultBuildExecuter.access $ 200(DefaultBuildExecuter .java:23) at org.gradle.execution.DefaultBuildExecuter $ 2.proceed(DefaultBuildExecuter.java:67) at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32) at org.gradle.execution。 DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61) 在org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:54) 在org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:155) 在或(org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:78) at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction。的java:38) 在org.gradle.launcher.exec.InProcessGradleLauncherActionExecuter.execute(InProcessGradleLauncherActionExecuter.java:39) 在org.gradle.launcher.exec.InProcessGradleLauncherActionExecuter.execute(InProcessGradleLauncherActionExecuter.java:25) 在org.gradle。 launcher.cli.RunBuildAction.run(RunBuildAction.java:50) 在org.gradle.launcher.cli.ActionAdapter.execute(ActionAdapter.java:30) 在org.gradle.launcher.cli.ActionAdapter.execute(ActionAdapter。 java:22) at org.gradle.launcher.cli.Com mandLineActionFactory $ ParseAndBuildAction.execute(CommandLineActionFactory.java:200) 在org.gradle.launcher.cli.CommandLineActionFactory $ ParseAndBuildAction.execute(CommandLineActionFactory.java:173) 在org.gradle.launcher.cli.CommandLineActionFactory $ WithLogging.execute( CommandLineActionFactory.java:169) 在org.gradle.launcher.cli.CommandLineActionFactory $ WithLogging.execute(CommandLineActionFactory.java:138) 在org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33) 在org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22) at org.gradle.launcher.Main.doAction(Main.java:48) at org.gradle.launcher.bootstrap.EntryPoint.run( EntryPoint.java:45) at org.gradle.l (org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:50) at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java: 32) 在org.gradle.launcher.GradleMain.main(GradleMain.java:26)

引起:org.gradle.api.GradleException:無法複製的ZIP條目的/ dev/SHM/263985 /變壓器/高速緩存/artifacts-14/filestore/info.cukes/cucumber-java/1.1.3/jar/4b389fbe494942b319518d27ae38571f477967f6/cucumber-java-1.1.3.jar!cucumber/api/java/ar/??.class to'/ dev/SHM/263985 /變壓器/目標/ TMP/expandedArchives /黃瓜-java的1.1.3.jar_6mn6efsv2arssmg9fup79f3fm5 /黃瓜/ API/JAVA/AR/??類。 at org.gradle.api.internal.file.AbstractFileTreeElement.copyTo(AbstractFileTreeElement。java:68) at org.gradle.api.internal.file.archive.ZipFileTree $ DetailsImpl.getFile(ZipFileTree.java:124) at org.gradle.api.internal.file.AbstractFileTree $ 1.visitFile(AbstractFileTree.java :39) 在org.gradle.api.internal.file.AbstractFileTree $ FilteredFileTree $ 1.visitFile(AbstractFileTree.java:145) 在org.gradle.api.internal.file.archive.ZipFileTree.visit(ZipFileTree.java: 90) ... 61更多

引起:java.io.IOException:無法在文件?? .class上設置文件權限420。 errno:84 at org.gradle.internal.nativeplatform.filesystem.LibcChmod.chmod(LibcChmod.java:39) at org.gradle.internal.nativeplatform.filesystem.GenericFileSystem.chmod(GenericFileSystem.java:67) at org .gradle.api.internal.file.AbstractFileTreeElement.copyTo(AbstractFileTreeElement.java:65) ...... 65多個

注:當您使用gradle這個1.1 JVM 1.7也能正常工作。

讓我知道如果你們知道爲什麼會發生這種情況,是否有任何修復或替代方案。 在此先感謝!

+0

我想知道它爲什麼在JVM 1.7上工作?以下解決方案與Java無關。 – 2014-01-21 14:14:47

回答

2

您可能遇到了我們遇到的問題。我不確定我們是否100%理解它,但是看起來解壓縮只讀文件的歸檔文件可能會很困難。 Gradle嘗試檢查其已解壓縮的任何文件的zip文件,以確定解壓縮任務是否爲最新版本,並且如果存檔文件具有隻讀文件,此過程可能會炸燬。

通知線條像這樣在您的堆棧跟蹤:

org.gradle.api.internal.changedetection.CompositeUpToDateRule.create 
Caused by: java.io.IOException: Failed to set file permissions 420 on file 

不太確鑿的證據,但一個非常強有力的影響。我們的解決方案(哈克,我承認)是使用下面的代碼:

def fixExpandedArchivesForLinux() { 
    // This interesting hackery fixes the expandedArchives directory 
    // to avoid the read-only extracted ZIP file contents issue. 
    def dir = new File(buildDir, "tmp/expandedArchives") 
    FilePermissions.chmodRecursively(dir, 0200) 
} 

你可以把一個先做允許gradle這個重新展開存檔,同時它檢查了最新狀態。

+0

謝謝喬希!我們通過不創建可執行文件來解決問題。我們創建了所有罐子的檔案並用它來執行測試。 – vchethan 2013-10-14 19:11:27

+0

我很高興你找到了答案。如果您發現我的回覆很有用,請隨時註冊。 :) – 2013-10-15 14:44:27

+0

但是'FilePermissions'類來自哪裏? Gradle腳本說沒有這樣的類存在。而且我無法找到可能做同樣事情的替代方案。 – anirvan 2016-05-09 04:53:35

0

我在使用android庫(aars)時遇到了類似的問題。我通過刪除空氣爆炸目錄來解決問題。

DEF海峽= 「室射頻 」+ buildDir.absolutePath +「/分解-AAR」 str.execute()

0

我剛涉及在黃瓜稱爲 「??。類」 文件同樣的問題。 從

./gradlew connectedCheck --debug --stacktrace 

一個運行異常的原因呈現以下根源

Caused by: net.rubygrapefruit.platform.NativeException: 
Could not set UNIX mode on .../app/build/tmp/expandedArchives/cucumber-java-1.2.4.jar_bkzp93af0tagkjvsr5vkgywjd/cucumber/api/java/ar/??.class: 
could not convert string to current locale 

事實證明,我有我的語言環境的問題,爲此,我以前忽略其他命令行所有警告工具。 我檢查哪些語言環境中/etc/locale.conf提及,未註釋在/etc/locale.gen相應線和跑

sudo locale-gen 

再生區域設置。 之後,文件名顯示爲ਅਤੇ.class,並且解壓縮完美無瑕。