Maven测试执行错误

Flo*_*umé 4 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等),绝对没有类别或测试,将收到'common'和'server'罐子
  • ...\dev\Sandbox\application \:'ear'模块,包含application.xml,将收到'webapp'战争

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

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

[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
Run Code Online (Sandbox Code Playgroud)

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

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

更令人惊讶的是,错误提到了"客户端"模块的路径,而在"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] ------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

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

感谢您的时间.

问候

Rya*_*art 5

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

为了说明,假设你有模块foobar,这是两个模块top-level,并bar依赖于foo.与Maven 2,如果你运行mvn compiletop-level,它当然会编译都foobar.它不会做的是bar针对刚刚编译的版本编译foo.换句话说,如果你刚刚在一个类中添加了一个新方法,foo并且一个类在bar使用它时,你会通过运行得到一个编译错误mvn compile.这是因为Maven 2只能从存储库中解析工件,并且由于您没有将新版本安装foo到本地存储库,因此该方法不可用bar.

这非常令人讨厌并且需要进行大量更改,因此Maven 3对其进行了更改.随着mvn compileMaven的3下的${project.build.outputDirectory}foo将是什么在依赖bar解析为.使用这种方法,这mvn compile将起作用,因为首先foo编译,然后bar编译时,而不是foo使用本地repo 中的最新jar,它用于foo/target/classes满足依赖,当然,它具有最新版本foo.

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