간혹 이클립스에서 maven compile이나 package 등이 필요할 때가 있다. 일반적인 compile의 경우는 이클립스에 있는 maven 플러그인이 해 주지만, Run as -> build 등의 메뉴를 통해 직접 maven을 수행해서 jar 파일 등이 필요할 때..
헌데 workspace에 있는 다른 프로젝트가 dependency로 걸려 있다면.. 그리고 그 프로젝트는 아직 개발 중이라 maven deploy 등을 하지 않아 maven remote repository는 커녕 local repository에도 존재하지 않는 경우.. 이런 예외와 함께 실패하는 것을 볼 수 있다.
goal: clean compile
[INFO] BUILD FAILURE
[INFO] ————————————————————————
[INFO] Total time: 1.440s
[INFO] Finished at: Thu Nov 10 17:04:16 KST 2011
[INFO] Final Memory: 4M/15M
[INFO] ————————————————————————
[ERROR] Failed to execute goal on project child-project: Could not resolve dependencies for project test:child-project:jar:0.0.1-SNAPSHOT: Could not find artifact test:lib-project:jar:0.0.1-SNAPSHOT in repo (http://remote_repository:8080/nexus/content/groups/public/) -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal on project child-project: Could not resolve dependencies for project test:child-project:jar:0.0.1-SNAPSHOT: Could not find artifact test:lib-project:jar:0.0.1-SNAPSHOT in repo (http://remote_repository:8080/nexus/content/groups/public/)
at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies(LifecycleDependencyResolver.java:196)
at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies(LifecycleDependencyResolver.java:108)
at org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved(MojoExecutor.java:258)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:201)
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)
… (생략) …
[ERROR]
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
이 경우의 원인은 maven 명령을 실행할 때 workspace에 있는 프로젝트를 참조하지 못 해서 발생하는 경우이다. 해결 방법은.. 이클립스 maven 플러그인의 실행 화면(프로젝트 오른쪽 클릭 -> Run As -> Run Configurations…)에서 Profiles 설정 아래에 있는 “Resolve Workspace artifacts”에 체크를 해주면 된다.
단, 이 해결방법은 goal이 package인 경우는 아래와 같은 오류를 볼 수 있다.
[INFO] BUILD FAILURE
[INFO] ————————————————————————
[INFO] Total time: 13.879s
[INFO] Finished at: Thu Nov 10 16:42:27 KST 2011
[INFO] Final Memory: 19M/46M
[INFO] ————————————————————————
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default-war) on project child-project: Failed to copy file for artifact [test:lib-project:jar:0.0.1:compile]: D:\workspace\Java\test\lib-project\target\classes (액세스가 거부되었습니다) -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
그 이유는.. package goal을 수행하는 경우에는 packaging을 하기 위해 default-war 플러그인을 사용하는데, dependency의 실제 jar 파일이 필요하기 때문이다. 이 문제를 해결하기 위해 dependency가 걸려 있는 프로젝트를 maven local repository에 install하면 된다. child-project가 lib-project를 참조(dependency)하고 있는 경우 lib-project를 먼저 install하고 child-project를 packaging하면 된다. (개발 중이라 remote repository에 deploy하지 못 한다면.. 어차피 SNAPSHOT이라면 deploy해도 되겠지만..)
단, 이 경우는 이미 install된 파일이 local repository에 있을테니.. “Resolve Workspace artifacts”의 체크를 빼고 수행해줘야 한다. 그러지 않으면 workspace를 계속 참조하는데 jar 파일이 존재하지 않기 때문에 계속 같은 예외를 보게 될 것이다.