#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, у меня тоже возникла эта проблема. Надеюсь, это может вам помочь.