2010-01-25 15 views
17

W moim projekcie pracy zostałem ostatnio poproszony o wygenerowanie plików POM za pośrednictwem klasy java. Problem polega na tym, że jestem bardzo, bardzo nowy w Maven (jak od grudnia ubiegłego roku).Czy istnieje klasa Java, która generuje plik POM.xml?

Potrzebuję jakiegoś kodu, który generuje plik xml (plik pom, ale jeśli mogę skonfigurować dowolny kod tworzący xml, który będzie w porządku) biorąc pod uwagę wszystkie niezbędne dane, więc nie trzeba ich zapisywać ręcznie. Nie wiem, czy tłumaczę się, ale pytanie brzmi: czy istnieje biblioteka lub klasa, która generuje lub tworzy plik POM z danymi? Jeśli nie jest to w porządku, po prostu nie chcę tracić więcej czasu na szukanie czegoś, czego nie wiem, czy istnieje, lub jeśli jest tak proste, jak deklarowanie obiektu POM, a następnie robienie banalnego dokumentu d = generatePom (POM p). Ponieważ nikt nie narzeka na to, jak ciężko jest pisać pliki POM, przypuszczam, że powinien być łatwy sposób na ich wykonanie, ale myślę, że zatraciłem się w wielu javadoc API i nie mogę znaleźć drogi powrotnej.

Mój pomysł, jeśli nie ma na to kodu, to wyszukanie słownika POM (w celu objęcia wszystkich elementów) i utworzenie pliku xml z danym obiektem POM (który poprzednio wypełniłem danymi, które dostarczyłem), przy użyciu generatora XML, takiego jak JDOM, XOM lub XStream. Wszelkie przemyślenia na ten temat będą mile widziane, jeśli nie ma klasy, która już to robi (np. "Hej, robisz to NIEPRAWDA").

PS: Czytałem, że projekt Eclipse wykonuje pewne czynności Mavena i ma interfejs API, który generuje plik pom.xml dla rzeczywistego projektu, który posiadasz. Byłoby wspaniale, gdybym mógł przesłonić dane wejściowe lub coś takiego.

Dzięki za wszystko!

Odpowiedz

37

To zależy od tego, co chce zrobić. Jeśli chcesz tylko tworzyć POM dla nowych projektów z pewnością, najlepszym sposobem jest stworzenie archetypów Mavena (możesz tworzyć własne archetypy za pomocą pożądanych szablonów).

Jeśli naprawdę mają potrzebę programowo napisać POM, można użyć następujących:

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); 

... gdzie w jest java.io.Writer i dodać wszystkie niezbędne obsługę wyjątków.

Javadoc jest tutaj: http://maven.apache.org/ref/2.2.1/maven-model/apidocs/index.html

Aby uzyskać dostęp do tego API, należy dodać tę zależność:

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

istnieje odpowiedni czytać API jak również, ale należy pamiętać, że nie będzie wykonaj wszystkie operacje Mavena, takie jak dziedziczenie i interpolacja (w tym celu wymaga to bardziej zaawansowanego wykorzystania API).

+0

Wow! To znaczy ... to jest to, czego szukałem. Naprawdę mogę zrobić wszystkie settery i zapisać plik pom.xml w dowolnym miejscu. Próbowałem trochę tej biblioteki i wydaje się czynić cuda. Naprawdę dzięki! :) – Random

+3

Jeśli zastanawiasz się, jak Brett to wie, to dlatego, że napisał Apache Maven2: Skuteczna implementacja: http://brettporter.wordpress.com/ –

+0

To jest niesamowite. Wielkie dzięki za sugestię. Ta biblioteka jest całkiem przydatna ... !!! –

1

Dlaczego trzeba to zrobić w Javie, zamiast używać istniejącego narzędzia, takiego jak m2eclipse.
Zobacz guide, aby utworzyć POM dla istniejącego projektu przy użyciu programu m2eclipse.

Możesz również zobaczyć m2eclipse developer guide, który pozwoli ci zobaczyć kod źródłowy do ich implementacji.

Odpowiedz ----
Jest to typowy problem napotkany podczas próby zmanipulowania projektu.
Największą przeszkodą jest próba zidentyfikowania prawidłowego maven coordinates.
Często projekty odwołują się do plików jar o zmienionej nazwie, w których identyfikator grupy i numery wersji zostały usunięte.

Czasami sprawdzanie manifestu w pliku jar daje pewne wskazówki dotyczące właściwego artefaktu zależnego.

+0

Pomysł polega nie tylko na wygenerowaniu pom.xml projektu, nad którym pracuję, ale na wygenerowaniu pliku pom.xml dowolnego projektu. Rozumiem, że przechowują potrzebne dane, a następnie przekazują je do utworzenia pom. Nie wiem, jak przechowują te dane (lub dlaczego po prostu nie generują pom zamiast ich przechowywania) Wiem tylko, że je odbieram (hurra modularny biznes). Dzięki za przewodników będę wyglądać, co mogę zrobić z ich kodem :) – Random

+0

Dzięki za radę :) Chociaż mam dane te mam nadzieję, że są poprawne i prawdziwe. W każdym razie, mam problemy ze współrzędnymi Maven, a następnie sprawdzę, w jaki sposób dane są podane i przypuszczam, że byłby to jakiś rodzaj problemu z połączeniem (ale mam nadzieję, że tak się nie stanie!). Odpowiedź, której udzielił Brett Porter, była właśnie tym, czego naprawdę potrzebowałem. Naprawdę mam nadzieję, że nie będzie więcej problemów :) – 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);; 

referencyjny: http://plexus.codehaus.org/plexus-components/plexus-interpolation/index.html

chociaż ja wciąż tkwi jeśli muszę dodać wiele (nieznana liczba) zależnościami.

Powiązane problemy