2013-04-17 2 views
3

Maven 플러그인을 작성 중이며 특정 종속성을 자동으로 해결하고 플러그인에 지정된 매개 변수를 기반으로 프로젝트에 종속성으로 추가하려고합니다.프로그래밍 방식으로 MavenProject에 Artifact를 추가 할 수 있습니까?

aether을 통해 종속성을 성공적으로 해결할 수 있었지만 aether와 MavenProject 사이의 연결이 끊어지는 것 같습니다.

내가 사용하고자하는 MavenProject # addAttachedArtifact에 대한 메소드가 있습니다. 그러나, aether로부터 검색된 것은 org.sonatype.aether.artifact.Artifact 인 반면, org.apache.maven.artifact.Artifact를 취합니다. 나는 두 가지 사이의 변환 방법을 가지고있는 plugin을 발견했지만, 좀 더 표준적인 접근 방식이되어야한다고 생각합니다.

또한 DefaultArtifactFactory를 사용하여 org.apache.maven.artifact.Artifact를 만들었지 만 ArtifactHandler를 가져 오려고 할 때 NullPointerException이 발생했습니다.

코드 :

DefaultArtifactFactory factory = new DefaultArtifactFactory(); 
Artifact mavenArtifact = factory.createBuildArtifact("com.beust", "jcommander", "1.27", "jar"); 

결과 :

Caused by: java.lang.NullPointerException 
     at org.apache.maven.artifact.factory.DefaultArtifactFactory.createArtifact(DefaultArtifactFactory.java:155) 
     at org.apache.maven.artifact.factory.DefaultArtifactFactory.createArtifact(DefaultArtifactFactory.java:117) 
     at org.apache.maven.artifact.factory.DefaultArtifactFactory.createArtifact(DefaultArtifactFactory.java:111) 
     at org.apache.maven.artifact.factory.DefaultArtifactFactory.createBuildArtifact(DefaultArtifactFactory.java:75) 
     at com.foo.bar.module.IncludeModuleFrontEndMojo.execute(IncludeModuleFrontEndMojo.java:165) 
     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) 
     ... 20 more 

그래서 정말, 이런 내가, 이러한 문제의 해결이 좋을 것 시도한 것들,하지만 난 ' 정말 후 방법이. 어떤 아이디어? UPDATE

내가 두 클래스 사이에 내 자신의 변환 방법 작성 :

private static org.apache.maven.artifact.Artifact aetherToMavenArtifactBasic(Artifact artifact, String scope, ArtifactHandler artifactHandler) { 
    DefaultArtifact mavenArtifact = new DefaultArtifact(artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), scope, artifact.getExtension(), artifact.getClassifier(), artifactHandler); 
    mavenArtifact.setFile(artifact.getFile()); 
    mavenArtifact.setResolved(true); 
    return mavenArtifact; 
} 

을하고 MavenProject # addAttachedArtifact 방법은 기존의 유물로 이슈를 부착하는 것을 발견 (즉, 소스를 첨부/javadocs jars를 artifact로 옮긴다.) 이것은 내 목표가 아니다. 대신 내가 받는다는 프로젝트에서 아티팩트를 가지고 내 유물을 추가합니다. (I 프로젝트의 getArtifactMap를 (호출 할 때 내 유물이 다음 표시) 및 getCompileClasspathElements()하지만,이 프로젝트에 내 유물을 추가

project.getArtifacts().add(mavenArtifact); 

.. 질문으로 발전했습니다 그래서 지속되지 않는 변경이 내가 정말 걱정하는 문제는 다음과 같습니다?

내가 MavenProject을 변경하고 계속 가질 수

+0

이미 존재하는 경우 알고 계시겠습니까? :). 내가 명확하게 제목을 업데이 트했습니다. 나는 프로그램 적으로 종속성을 추가하려고한다. – Noremac

답변

0

나는이 생각하지 않습니다 가능하며 내 목적에 따라 사용자를 프로젝트의 pom 파일에 종속성을 추가하십시오 (없는 경우 오류가 발생 함).

사용자가 프로젝트 구성을 사용하여 플러그인을 통해 빌드를 중단 할 수있는 지점까지 허락하지 않도록 설계된 것처럼 보입니다. good post on advanced MOJO development here을 찾았습니다. 그것에서 인용 :

이 매개 변수를 사용자가 쉽게 깨질 수 주 종속 섹션 별도로 지정 될 수 있다면 자신의 빌드 - 특히 경우 질문 컴파일 된 프로젝트의 소스 코드에서 모조. 이 경우 직접 구성을 사용하면 컴파일시 종속성이 이지만 테스트에는 사용할 수 없습니다. 따라서 @readonly 주석은 특정 Plugin 만 구성하는 대신 사용자가 POM을 구성하도록합니다.