Ошибка выполнения теста Maven

#java #maven

#java #maven

Вопрос:

Когда я использую Maven для запуска модульных тестов для своего приложения Java EE, я получаю странную ошибку: org.apache.maven.plugin.Исключение MojoExecutionException: невозможно скопировать артефакт в рабочий каталог, вызванный java.io.FileNotFoundException: D:WorkProjetsRT_GAFDevSandboxclienttargetclasses (Доступ запрещен)

Структура приложения Maven :

  • … Dev Sandbox : корень приложения, это модуль ‘pom’, в котором перечислены другие модули
  • …Dev Sandbox common : модуль ‘jar’, содержит классы, общие для клиента и сервера, и тесты (только для JUnit)
  • … Dev Sandbox client : модуль ‘jar’, содержит интеллектуальные классы на стороне клиента (Swing и т. Д.) И тесты (только для JUnit), развернутые через Java Web Start
  • … Dev Sandbox server : модуль ‘jar’, содержит классы на стороне сервера (MVC, DAO и т. Д.) И тесты (как JUnit, так и Arquillian)
  • … Dev Sandbox webapp : модуль ‘war’, содержит веб-элементы (JSP, изображения, web.xml , и т.д.), АБСОЛЮТНО НИКАКИХ КЛАССОВ ИЛИ ТЕСТОВ, получат «общие» и «серверные» банки
  • … Dev Sandbox application : модуль ‘ear’, содержит application.xml , получит войну «веб-приложений»

Как уже объяснялось, у нас есть тесты 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:WorkProjetsRT_GAFDevSandboxclienttargetclasses (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:WorkProjetsRT_GAFDevSandboxclienttargetclasses (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 в трассировке стека («JnlpDownloadServletMojo«).

Что еще более удивительно, в ошибке упоминается путь к модулю ‘client’, в то время как ошибка возникает во время обработки модуля ‘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] ------------------------------------------------------------------------
  

Ребята, вы знаете, что происходит? Почему выполнение тестов останавливается? И как я могу это исправить?

Спасибо за ваше время.

С уважением

Ответ №1:

Вы используете Maven 3, верно? Вы недавно обновились с Maven 2? Один из ваших плагинов был написан для Maven 2 и не обновлялся для 3. В Maven 3 добавлена поддержка разрешения зависимостей для модулей в реакторе для текущей сборки, что является действительно отличной функцией, но это означает, что зависимость модуля теперь может быть разрешена в каталог, а не только в файлы jar. Плагины, которые предполагают, что зависимости всегда являются файлами jar, терпят неудачу подобным образом.

Для иллюстрации представьте, что у вас есть модули foo и bar , которые являются модулями top-level и bar зависят от foo . С Maven 2, если вы запустите mvn compile top-level , он, конечно, скомпилирует оба foo и bar . Чего он не будет делать, так это компилировать bar против только что скомпилированной версии foo . Другими словами, если вы только что добавили новый метод в класс in foo , а класс in bar использует его, вы получите ошибку компиляции при запуске mvn compile . Это связано с тем, что Maven 2 имеет возможность разрешать артефакты только из репозитория, и поскольку вы не устанавливали новую версию foo в локальный репозиторий, метод недоступен bar .

Это было довольно раздражающим и требовало значительных изменений, поэтому Maven 3 изменяет его. В mvn compile рамках Maven 3 значение ${project.build.outputDirectory} of foo будет соответствовать тому, к чему bar относится зависимость в. При таком подходе это mvn compile будет работать, потому что сначала foo компилируется, а затем, когда bar компилируется, вместо того, чтобы использовать последнюю foo jar в локальном репозитории, он использует foo/target/classes для удовлетворения зависимости, в которой, конечно, есть последняя версия foo .

То, что вы видите, — это старый плагин, который предполагает — как и в Maven 2 — что зависимости всегда разрешаются для файлов. В Maven 3 это не всегда верно.

Комментарии:

1. Спасибо за информацию. Я нашел несколько устаревших плагинов: maven-ear-plugin ………………………………….. 2.5 -> 2.6 maven-банка-плагин ………………………………. 2.3.1 -> 2.3.2 maven-javadoc-плагин ………………………………. 2.7 -> 2.8 maven-ресурсы-плагин …………………………. 2.4.2 -> 2.4.3 Я обновил их, но это ничего не меняет.

2. Из трассировки стека я думаю, что неисправным плагином является плагин WebStart. Я использую webstart-maven-plugin 1.0-beta-1. Это известная проблема? Существуют ли известные решения? Спасибо за ваше время.

3. Вручную обновлен webstart-maven-plugin до версии 1.0-beta-2. То же сообщение об ошибке.

Ответ №2:

Глядя на ошибку, кажется довольно очевидным, что пользователь, выполняющий mvn, не имеет прав доступа к D:WorkProjetsRT_GAFDevSandboxclienttargetclasses Проверьте настройки доступа к каталогам для чтения и записи.

Кроме того, я не могу сказать, не видя файлов pom.

Комментарии:

1. Я тоже это заметил. Я могу сказать, что у меня есть полный доступ ко всем файлам и папкам, задействованным здесь.

Ответ №3:

Запустите eclipse от имени администратора. Шаги: щелкните правой кнопкой мыши на eclipse и скажите «запуск от имени администратора».

Ответ №4:

Обратите внимание, что в вашем каталоге есть этот файл? Пожалуйста, проверьте это внимательно.

Как только я использовал ant, у меня тоже возникла эта проблема. Надеюсь, это может вам помочь.