2010-01-25 5 views
17

내 직업 프로젝트에서 나는 최근에 자바 클래스를 통해 POM 파일을 생성하도록 요청 받았다. 문제는 내가 Maven에 아주 아주 새로운 것이다. (지난 12 월 이후).POM.xml 파일을 생성하는 Java 클래스가 있습니까?

내가 필요한 것은 xml 파일 (pom 파일을 생성하는 코드)이지만 필요한 모든 데이터가 주어지면 xml 파일을 작성하여 구성 할 수 있으므로 작성해야 할 필요가 없습니다. 손으로. 내가 나 자신을 설명 할 지 모르겠다.하지만 문제는 주어진 데이터로 POM 파일을 생성하거나 생성하는 라이브러리 나 클래스가 있는가하는 것이다. 그게 괜찮지 않다면, 나는 단지 존재하는 경우 또는 POM 개체를 선언하고 사소한 문서 d = generatePom을하는 것처럼 간단하다면 모르는 것을 검색하는 데 더 많은 시간을 낭비하고 싶지 않습니다. POM p). 아무도 POM 파일을 작성하는 것이 얼마나 어려운지에 대해 불평하지 않기 때문에 쉽게 할 수있는 방법이 있어야합니다.하지만 API javadoc을 많이 잃어 버렸다고 생각합니다.

필자가 생각하기에이 코드가 없다면 POM 사전을 검색하고 (제공된 요소로 채웠던) 주어진 POM 개체로 XML 파일을 만드는 것입니다. JDOM, XOM 또는 XStream과 같은 XML 생성기를 사용합니다. 이미이 작업을 수행하는 클래스가 없으면 (예 : '어이! 네가 잘못하고있다'와 같은) 클래스에 대한 어떤 생각도 감사 할 것입니다.

추신 : 나는 이클립스 프로젝트가 몇 가지 메이븐 (Maven) 작업을하고 있으며 실제 프로젝트에 대한 pom.xml 파일을 생성하는 API가 있다는 것을 읽었습니다. 입력 데이터 나 다른 데이터를 무시할 수 있다면 큰 도움이 될 것입니다.

모두에게 감사드립니다!

답변

37

당신이하려는 일에 달려 있습니다. 확실한 유형의 새로운 프로젝트를위한 POM을 만들고 싶다면 가장 좋은 방법은 Maven 아키 타입 (원하는 템플릿으로 자신 만의 아키타 입을 만들 수 있습니다)입니다.

import org.apache.maven.model.*; 
import org.apache.maven.model.io.xpp3.MavenXpp3Writer; 
... 
Model model = new Model(); 
model.setGroupId("some.group.id"); 
... 
new MavenXpp3Writer().write(w, model); 

... w는 java.io.Writer에이고 당신이 필요한 모든 예외 처리를 추가 할 경우 : 당신이 정말 프로그래밍 POM을 쓸 필요가있는 경우

, 당신은 다음을 사용할 수 있습니다.

관한 Javadoc은 여기에 있습니다 : http://maven.apache.org/ref/2.2.1/maven-model/apidocs/index.html

이 API에 액세스하려면이 종속성 추가해야합니다 : 마음에 해당하는 읽기 API뿐만 아니라이

<dependency> 
    <groupId>org.apache.maven</groupId> 
    <artifactId>maven-model</artifactId> 
    <version>2.2.1</version> 
</dependency> 

하지만 곰 즉, 그것은하지 않습니다 상속 및 보간과 같은 모든 Maven 작업을 수행하십시오 (고급 API 사용이 필요함).

+0

와우! 내 말은 ... 내가 실제로 찾고있는 것이지. 필자는 모든 설정자를 수행하고 원하는 위치에 pom.xml 파일을 작성할 수 있습니다. 나는이 도서관을 조금이라도 시험해보고 경이로울 것 같다. 정말 고마워! :) – Random

+3

브렛 (Brett)이 이것을 어떻게 아는지 궁금한 점은 그가 Apache Maven2를 작성했기 때문입니다. 효과적인 구현 : http://brettporter.wordpress.com/ –

+0

이것은 대단합니다. 제안 해 주셔서 감사합니다. 이 라이브러리는 꽤 쓸만합니다 ... !!! –

1

왜 m2eclipse와 같은 기존 도구를 사용하는 대신 java에서해야합니까?
m2eclipse를 사용하여 기존 프로젝트의 POM을 생성하려면 guide을 참조하십시오.

또한 구현을위한 소스 코드를 볼 수있는 m2eclipse developer guide을 볼 수 있습니다.

대답 ----
이것은 프로젝트를 메이븐지화할 때 발생하는 일반적인 문제입니다.
가장 큰 장애물은 올바른 maven coordinates을 식별하려고합니다.
종종 프로젝트는 그룹 ID 및 버전 번호가 제거 된 이름이 바뀐 jar 파일을 참조합니다.

때때로 jar 파일의 매니페스트를 검사하면 올바른 종속 아티팩트에 대한 힌트가 제공됩니다.

+0

아이디어는 내가 작업하고있는 프로젝트의 pom.xml을 생성하는 것이 아니라 모든 프로젝트의 pom.xml 파일을 생성하는 것입니다. 나는 그들이 필요한 데이터를 저장하고 그 다음에 그것을 만들어서 pom을 생성한다는 것을 이해한다. 나는 그들이이 데이터를 어떻게 저장하는지 (또는 왜 단지 pom을 저장하는 대신에 그것을 생성하지 않는지) 모르겠다. 나는 그것을 단지 암기해야한다는 것을 알고있다. (hurray modular bussines). 안내서를 주셔서 감사합니다. 코드로 할 수있는 것을 보겠습니다. – Random

+0

조언을 주셔서 감사합니다 :)이 데이터가 주어지기는하지만 실제로 올바른 것이며 현실이되기를 바랍니다. 어쨌든, Maven 좌표에 문제가있을 것인가? 그런 다음 데이터가 어떻게 주어 졌는지 검사 할 것이고 연결 문제가 될 수도있다. (그런 일은 일어나지 않기를 바란다!). 브렛 포터 (Brett Porter)가 제시 한 대답은 내가 실제로 필요한 것이었다. 나는 더 이상 문제가 없기를 정말로 바란다 :) – Random

3
 MavenXpp3Reader reader = new MavenXpp3Reader(); 
     Model pomModel = reader.read(new FileReader(pomLibFile)); 
     final List<Dependency> dependencies= pomModel.getDependencies(); 
     final List<String> modules= pomModel.getModules(); 
     final List<Profile> profiles = pomModel.getProfiles(); 

     InputStream inputStream = new FileInputStream(new File(pomLibFile)); 
     StringWriter writer = new StringWriter(); 
     IOUtils.copy(inputStream, writer, "utf-8"); 
     pomModel.getDependencyManagement(); 
     final Properties properties = new Properties(); 
     properties.load(new FileInputStream(pomProperties)); 
     RegexBasedInterpolator interpolator = new RegexBasedInterpolator(); 

     interpolator.addValueSource(new EnvarBasedValueSource()); 
     interpolator.addValueSource(new PropertiesBasedValueSource(properties)); 

     List<String> synonymPrefixes = new ArrayList<String>(); 
     synonymPrefixes.add("project."); 
     synonymPrefixes.add("pom."); 

     PrefixedValueSourceWrapper modelWrapper = new PrefixedValueSourceWrapper(new ObjectBasedValueSource(pomModel),synonymPrefixes, true); 
     interpolator.addValueSource(modelWrapper); 

     PrefixedValueSourceWrapper pomPropertyWrapper = 
       new PrefixedValueSourceWrapper(new PropertiesBasedValueSource(pomModel.getProperties()), synonymPrefixes, true); 
     interpolator.addValueSource(pomPropertyWrapper); 

     interpolator.addValueSource(new PropertiesBasedValueSource(properties)); 

     RecursionInterceptor recursionInterceptor = new PrefixAwareRecursionInterceptor(synonymPrefixes, true); 

     String serializedPOM = interpolator.interpolate(writer.toString(), recursionInterceptor); 
     System.out.println("-------- "+serializedPOM);; 

참조 : http://plexus.codehaus.org/plexus-components/plexus-interpolation/index.html I 종속성 여러 (알 수없는 번호)를 추가해야하는 경우 아직도 붙어 있지만

.

관련 문제