2013-04-23 8 views
6

Pracuję w ustalonym kodzie z istniejącym oddzielnym pom.xml.Czy projekt maven parent może zawierać moduł na tym samym poziomie katalogowym?

Intencją jest włączenie projektu podrzędnego o nazwie "ul" do podkatalogu poza macierzystym. Uwaga: plik ul/pom.xml już istnieje i działa samodzielnie.

Więc w pom.xml rodzica I dodaje:

<modules> 
     <module>hive</module> 
    </modules> 

Problemem jest to, że w zasadzie tracą zdolność do tworzenia się wdrożyć słoik z projektu nadrzędnego.

[email protected]:/shared/git2/etl$ mvn package assembly:single 
[INFO] Scanning for projects... 
[INFO] ------------------------------------------------------------------------ 
[ERROR] FATAL ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] Error building POM (may not be this project's POM). 


Project ID: com.myco.etl:etl 
POM Location: /shared/git2/etl/pom.xml 
Validation Messages: 

    [0] Packaging 'jar' is invalid. Aggregator projects require 'pom' as packaging. 


Reason: Failed to validate POM for project com.myco.etl:etl at /shared/git2/etl/pom.xml 


[INFO] ------------------------------------------------------------------------ 
[INFO] Trace 
org.apache.maven.reactor.MavenExecutionException: Failed to validate POM for project com.myco.etl:etl at /shared/git2/etl/pom.xml 
    at org.apache.maven.DefaultMaven.getProjects(DefaultMaven.java:404) 
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:272) 
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138) 
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:362) 
    at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

Wygląda na to, że maven chce, żebym utworzył macierzystą pompę, która w zasadzie nic nie robi, poza zdefiniowaniem modułów zależności.

Mogę utworzyć nowy pom.xml. Ale nie mogę tego zrobić, aby przenieść istniejące pliki projektu do nowego podkatalogu.

Czy istnieje sposób obejścia tego? Na przykład. definiowanie submodułu, który żyje na tym samym poziomie (nie subdir)? Lub jakiś inny sposób pracy z istniejącą strukturą dir?

dzięki

Follow-up: W oparciu o dane, które moduł może być po prostu plik w lokalnym katalogu, ja stworzyła kolejną pom który wywołuje pierwotnego. Oryginalny został przemianowany na pommod.xml, a nowy pokazany poniżej nazywa się pom.xml.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.myco.etl</groupId> 
    <artifactId>etl</artifactId> 
    <name> ETL Helpers</name> 
    <version>1.0.0-SNAPSHOT</version> 
    <packaging>pom</packaging> 
     <modules> 
    <module>appminer</module> 
    <module>pommod.xml</module> 
    </modules> 

wpadłem "mvn skompilować pakiet", ale wciąż ten sam błąd:

Project ID: com.myco:app_miner 
POM Location: /shared/git2/etl/mycopom.xml 
Validation Messages: 

[0] Packaging 'jar' is invalid. Aggregator projects require 'pom' as packaging. 


Reason: Failed to validate POM for project com.myco:app_miner at /shared/git2/etl/myco/pom.xml 

Odpowiedz

10

odpowiedzieć na pytanie w tytule tego postu:

Tak, Maven może dołącz rodzica i moduł na tym samym poziomie katalogu. Czuję, że najpierw muszę wyjaśnić, że rodzic może mieć dzieci i moduły. Dzieci i moduły to nie to samo:

  • Związek dzieci definiowany jest przez parent w potomku POM. Jeśli twój rodzic jest w repozytorium, to jest to. Jeśli twój rodzic jest w systemie plików, musisz grać z parent.relativePath, aby znaleźć go w tym samym folderze
  • Moduł jest zdefiniowany przez modules w macierzystym POM. Moduł zazwyczaj zawiera nazwę folderu, a plik POM jest domyślny (np. <module>mod</module> jest odpowiednikiem <module>mod/pom.xml</module>). Dlatego moduł w tym samym folderze byłby <module>pom1.xml</module> lub coś podobnego. (Zadzwoniłem do modułu plik POM pom1.xml w tym przykładzie, zakładając że pom.xml jest już zajęta przez rodzica — zobaczyć, co za bałagan jesteśmy coraz się w)

Let me szybko podane przykładem, gdzie dzieci i moduły wyraźnie różne: możesz mieć POMs do budowania aplikacji każdego z twoich zespołów. Każdy zespół może mieć aplikacje internetowe i aplikacje zaplecza. Możesz mieć macierzyste POM dla aplikacji webowych i aplikacji zaplecza. Tak więc niektóre aplikacje backendowe byłyby dzieckiem POM dla aplikacji backendowych, będąc jednocześnie modułem zespołu, który nad nim pracuje.


Chodzi mi o to, że mówisz o opakowaniu. Rodzic POM (opakowanie pom) jest zwykle tylko kroplą metadanych i niczym więcej. Jeśli chcesz, aby było coś jeszcze, możesz dołączyć egzekucje wtyczki do faz cyklu życia. Możesz nawet uruchamiać wtyczki do pakowania i dołączać wyniki do artefaktu.


nie rozumiałem dlaczego hive nie może być dziecko (własny folder własny POM w tym folderze), ładnie jeden poziom w dół od rodzica, jak Maven miał zamiaru go mieć. Ale brzmiało to tak, jakbyś mógł mieć jakiś projekt, w jakimkolwiek innym katalogu, być zależnym od artefaktu jar w hive i przekształcić go w dowolny zestaw, który chcesz. Tak więc hive byłoby zależne od projektu montażu (powiedzmy: hive-assembly). Że jest dotarcie do następnego punktu ...


fakt, że Maven ma w rzeczywistości pozwalają mieć rodzic i dziecko w tym samym folderze, nie jest wcale dobry argument dla takiego postępowania. To tylko kwestia czasu, gdy jakaś część Mavena lub jedna z jego wtyczek będzie działać przeciwko tobie. Maven to "convention over configuration", żyj tym!

+0

Użyłem twojej wskazówki, że moduł to plik pomXX.xml. Nadal występują problemy i zaktualizowano oryginalny wpis. – javadba

+0

Być może udostępnij trochę więcej szczegółów POM związanych z projektami. Którą budujesz, jak to się nie udaje? –

+0

Konieczne wydaje się posiadanie dwóch różnych pom's; jeden dla celu pom jako rodzica, a drugi dla pliku jar. Działa wtedy - choć niewygodne. – javadba

Powiązane problemy