Maven测试执行错误

时间:2011-10-21 12:20:08

标签: java maven

当我使用Maven为我的Java EE应用程序运行单元测试时,我收到一个奇怪的错误: org.apache.maven.plugin.MojoExecutionException:无法将工件复制到工作目录 java.io.FileNotFoundException引起:D:\ Work \ Projets \ RT_GAF \ Dev \ Sandbox \ client \ target \ classes(访问被拒绝)

应用程序的Maven结构是:

  • ... \ Dev \ Sandbox \:应用程序的根目录,这是一个列出其他模块的'pom'模块
  • ... \ Dev \ Sandbox \ common \:'jar'模块,包含客户端和服务器通用的类,以及测试(仅限JUnit)
  • ... \ dev \ Sandbox \ client \:'jar'模块,包含通过Java Web Start部署的智能客户端类(Swing stuff等)和测试(仅限JUnit)
  • ... \ Dev \ Sandbox \ server \:'jar'模块,包含服务器端类(MVC内容,DAO等)和测试(JUnit和Arquillian)
  • ... \ dev \ Sandbox \ webapp \:'war'模块,包含web项目(JSP,图像,web.xml等),绝对没有类别或测试,会收到'常见'和'服务器'罐子
  • ... \ dev \ Sandbox \ application \:'ear'模块,包含application.xml,将收到'webapp'战争

如上所述,我们有JUnit和Arquillian测试。

测试执行“mvn test -Pjbossas-remote-6”(该配置文件用于Arquillian测试,以便将容器内测试执行到JBoss 6)从应用程序的根失败:< / p>

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Sandbox ........................................... SUCCESS [0.003s]
[INFO] Sandbox Common .................................... SUCCESS [45.003s]
[INFO] Sandbox Client .................................... SUCCESS [20.226s]
[INFO] Sandbox Server .................................... SUCCESS [49.064s]
[INFO] Sandbox WebApp .................................... FAILURE [3.128s]
[INFO] Sandbox Application ............................... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1:57.663s
[INFO] Finished at: Fri Oct 21 10:07:03 CEST 2011
[INFO] Final Memory: 107M/478M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.codehaus.mojo.webstart:webstart-maven-plugin:1.0-beta-1:jnlp-download-servlet (default) on project sandbox-webapp: Unable to copy an artifact to the working directory: D:\Work\Projets\RT_GAF\Dev\Sandbox\client\target\classes (Access is denied) -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo.webstart:webstart-maven-plugin:1.0-beta-1:jnlp-download-servlet (default) on project sandbox-webapp: Unable to copy an artifact to the working directory
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:217)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:319)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
Caused by: org.apache.maven.plugin.MojoExecutionException: Unable to copy an artifact to the working directory
    at org.codehaus.mojo.webstart.JnlpDownloadServletMojo.retrieveJarResources(JnlpDownloadServletMojo.java:454)
    at org.codehaus.mojo.webstart.JnlpDownloadServletMojo.execute(JnlpDownloadServletMojo.java:136)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
    ... 19 more
Caused by: java.io.FileNotFoundException: D:\Work\Projets\RT_GAF\Dev\Sandbox\client\target\classes (Access is denied)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:106)
    at org.codehaus.plexus.util.FileUtils.copyFile(FileUtils.java:950)
    at org.codehaus.mojo.webstart.AbstractBaseJnlpMojo.copyJarAsUnprocessedToDirectoryIfNecessary(AbstractBaseJnlpMojo.java:569)
    at org.codehaus.mojo.webstart.JnlpDownloadServletMojo.retrieveJarResources(JnlpDownloadServletMojo.java:423)
    ... 22 more

正如您所看到的,'common','client'和'server'模块中的测试正确执行(是的!),但测试执行在'webapp'模块级别停止,即使此模块绝对不包含任何类(没有商业课程,没有考试)。

请注意,我们可以在堆栈跟踪中看到Java Web Start引用(“ JnlpDownloadServletMojo ”)。

更令人惊讶的是,在处理'webapp'模块期间发生错误时,错误提到了“客户端”模块的路径

如果我尝试在'webapp'模块中直接执行测试 可以正常工作(删除空行):

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
There are no tests to run.
Results :
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

你们知道发生了什么吗?为什么测试执行会停止?我怎么解决这个问题?

感谢您的时间。

此致

4 个答案:

答案 0 :(得分:5)

你正在运行Maven 3,对吗?你最近从Maven 2升级了吗?你的一个插件是为Maven 2编写的,并没有针对3.更新.Maven 3增加了对当前构建的反应器中模块的依赖关系的支持,这是一个非常好的功能,但它意味着模块依赖可以现在解决到一个目录而不是只有jar文件。假设依赖项总是 jar文件的插件会像这样失败。

为了说明,假设您有模块foobar,它们都是top-level的模块,而bar取决于foo。使用Maven 2,如果您在mvn compile中运行top-level,它当然会同时编译foobar不会做的是针对刚编译的bar版本编译foo。换句话说,如果您刚刚在foo中的某个类中添加了一个新方法,并且bar中的一个类使用了它,则运行mvn compile会出现编译错误。这是因为Maven 2只能从存储库中解析工件,并且由于您没有将新版本的foo安装到本地存储库,因此bar无法使用该方法。 / p>

这非常令人讨厌并且需要大量更改,因此Maven 3对其进行了更改。在Maven 3下使用mvn compile${project.build.outputDirectory}的{​​{1}}将成为foo中的依赖关系解析的内容。使用这种方法,bar将起作用,因为编译了第一个mvn compile,然后编译foo时,而不是使用本地存储库中的最新bar jar,它使用foo来满足依赖关系,当然,其中包含最新版本的foo/target/classes

你所看到的是一个旧的插件,它假设 - 就像在Maven 2中一样 - 依赖性总是解析为文件。在Maven 3下,情况并非总是如此。

答案 1 :(得分:0)

通过查看错误,很明显运行mvn的用户没有访问权限D:\ Work \ Projets \ RT_GAF \ Dev \ Sandbox \ client \ target \ classes检查目录的读写访问权限设置。

除此之外我不能说没有看到pom文件。

答案 2 :(得分:0)

请注意你的目录有这个文件?请仔细检查。

一旦我使用了 ant ,我也遇到了这个问题。希望这可以帮到你。

答案 3 :(得分:0)

以管理员身份运行eclipse。 脚步: 右键单击eclipse,然后以管理员身份运行。