# Maven



## Daniel1000 (27. Jul 2010)

Ich habe eine Frage zum Ausführen von maven Plugin
ich habe eine Mojo Plugin geschrieben welches 2 .xml dateien liest und eine .xml datei erstellt.
die Plugin macht auch das gewünschte.

zur meiner Frage:
Ich habe z.B. Ordner A,B,C
B und C sind unterordner von A
in B und C liegen jeweils die .xml Dateien die ich lese

Ich möchte nun die die Plugin im Konsole in A ausführen also

c:\A>mvn de.search:maven-search-plugin:search

Ich bekomme dann die Fehler dass es nicht ausgeführt werden kann weil es keine pom.xml Datei existiert.
Ich verstehe nicht wieso ich nochmal eine pom.xml brauche, die Stellen wo die .xml Dateien liegen habe ich in .java schon geschrieben. Das Plugin müsste also nur die java Datei ausführen???

Ich hoffe ich konnte mein Problem beschreiben...


----------



## maki (27. Jul 2010)

requiresProject steht wohl auf dem Defaultwert true...


----------



## Daniel1000 (27. Jul 2010)

Danke für die schnelle Antwort weisst du zufällig auch wie ich das auf false stellen kann


----------



## maki (27. Jul 2010)

In der plugin.xml: Maven - Mojo API Specification


----------



## Daniel1000 (27. Jul 2010)

ich habe plugin.xml geändert aber wenn ich mvn install ausführe dann schreibt er wieder auf requiersProject wieder true.
Auf der Seite die du geschrieben hast steht auch dass man mvn install ausführen soll
Was mache ich falsch?


----------



## Daniel1000 (28. Jul 2010)

ich habe es gefunden...
man muss "@requiresProject false" in java schreiben.

```
/**
 *
 * @goal search
 * @requiresProject false
 * 
 */
public class MyMojo extends AbstractMojo {
```

Wenn jemand anderes auch das gleich Problem haben sollte


----------



## Daniel1000 (28. Jul 2010)

Hallo nochmal,
ich habe ein anderes Problem.

In der Datei wo ich mein Plugin ausführen möchte steht eine pom.xml drin. Dann liest mein Plugin diese pom.xml und gibt Fehler aus.
Gibts eine Möglichkeit zu sagen dass das Plugin keine pom.xml lesen soll.
Gruß


----------



## kama (28. Jul 2010)

Hallo,

kannst Du mal die Struktur deines Projektes aufzeigen...

Gruß
Karl Heinz Marbaise


----------



## Daniel1000 (28. Jul 2010)

Ich glaube mit der Projektstruktur meinst die Ordnerstruktur wo das Plugin ausgeführt werden soll

data
          control
          test
          assambly
    core
          layout
          ...
    runtime

Das Plugin werde ich in data ausführen und fast in jedem Ordner (data eingeschlossen) gibts ein pom.xml. Ich benutze aber nur die in assembly und runtime.
Da in data ein pom.xml drin ist liest mein Plugin diese und gibt Fehler aus.


----------



## Daniel1000 (28. Jul 2010)

Ich glaube mit der Projektstruktur meinst die Ordnerstruktur wo das Plugin ausgeführt werden soll

```
data
          control
          test
          assambly
    core
          layout
          ...
    runtime
```
Das Plugin werde ich in data ausführen und fast in jedem Ordner (data eingeschlossen) gibts ein pom.xml. Ich benutze aber nur die in assembly und runtime.
Da in data ein pom.xml drin ist liest mein Plugin diese und gibt Fehler aus.


----------



## kama (28. Jul 2010)

Hallo,

also es wäre auch schön wenn Du die Fehlermeldung mit geliefert hättest....
abgesehen davon hast Du keine Integrations-Tests für Dein Plugin geschrieben, damit ist Testen nämlich sehr einfach...(siehe maven-invoker-plugin)...

Weiterhin wird von Maven selbst die pom.xml gelesen...

Gruß
Karl Heinz Marbaise


----------



## Daniel1000 (28. Jul 2010)

Die Fehler ensteht weil das Plugin ein pom.xml liest womit er nichts anfangen kann.
Mein Plugin braucht nichts zu lesen.
Da aber jedes Plugin die pom.xml liest wenn es in dem aufgerufenen Ordner drin ist liest auch mein Plugin.

genau das möchte ich vermeiden. Gibts irgendein Befehl womit ich das Lesen von pom.xml untersagen kann?
Ich weiss das klingt bisschen unsinnig ich glaube das würd auch garnicht gehen.

Danke für eure Mühe.
Gruß


----------



## maki (28. Jul 2010)

Maven arbeitet nunmal mit Poms, wenn diese fehlerhaft sind, gibt es Fehlermeldungen, welche du uns immer noch vorenthälst


----------



## Daniel1000 (3. Aug 2010)

Hallo zusammen,
tut mir leid dass ich so lange nicht schreiben konnte Ich musste plötzlich etwas anderes machen.

Das alles klappt leider nicht. Ich glaube ich habe das kommplet falsch angefangen.

Also fürs erste muss ich mit meinem Mojo eine andere pom.xml datei lesen und in der Datei nach dependency suchen und ihre versionen ausgeben
die pom.xml Datei sieht so aus (die sind ebenso selbstgeschrieben)

```
<dependency>
         <groupId>de.control.fw.impctrl.bl</groupId>
         <artifactId>fw.impctrl.bl.log-api</artifactId>
      </dependency>
      <dependency>
         <groupId>de.control.fw.impctrl.bl</groupId>
         <artifactId>fw.impctrl.bl.execution-api</artifactId>
      </dependency>
```
ich müsste z.B. die erste groupId und artifactId lesen und 1.0.0 ausgeben können.


----------



## bygones (3. Aug 2010)

geh  mal davon aus Maven Mojo - Byte-Welt Forum ist das selbe


----------



## kama (3. Aug 2010)

Hallo,



Daniel1000 hat gesagt.:


> Das alles klappt leider nicht. Ich glaube ich habe das kommplet falsch angefangen.


Das scheint mir auch so....

Wenn Du ein Plugin hast, dann liest Maven zuerst einmal die pom.xml ...auf die Infos hast Du im Plugin via Project zugriff....

Was Du machen kannst ist eine POM selbst lesen (Maven bietet genug dafür)...


```
public Model convertToModel(File pomFile) {
        MavenXpp3Reader reader = new MavenXpp3Reader();
        
        Model model = null;
        try {
            model = reader.read(new FileInputStream(pomFile));
        } catch (FileNotFoundException e) {
            LOGGER.error("FileNotFoundException: ", e);
        } catch (IOException e) {
            LOGGER.error("IOException: ", e);
        } catch (XmlPullParserException e) {
            LOGGER.error("XmlPullParserException: ", e);
        }
        return model;
    }
```

und dann noch

```
Model model = xxx.convertToModel(new File("pom.xml"));
```
und dann hast Du alles was Du brauchst auch die Dependencies...



Daniel1000 hat gesagt.:


> Also fürs erste muss ich mit meinem Mojo eine andere pom.xml datei lesen und in der Datei nach dependency suchen und ihre versionen ausgeben


Die Frage ist was Du erreichen möchtest...

Mit dem obigen ist dann die Ausgabe der Dependencies (einfach model.getDependencies())....

Gruß
Karl Heinz Marbaise


----------



## Daniel1000 (3. Aug 2010)

kama hat gesagt.:


> Hallo,
> 
> 
> ```
> ...



Das war was ich gesucht habe, vielen dank...

Ich hoffe aber ihr habt von mir noch nicht die Nase voll 

Jetzt muss ich noch zwei Sachen tun:
    1. die Version rausfinden das geht nicht einfach weil die Version nicht in der Abhängigkeiten drin stehen z.B.

```
<dependency>
         <groupId>de.control.fw.impctrl.bl</groupId>
         <artifactId>fw.impctrl.bl.log-api</artifactId>
      </dependency>
      <dependency>
         <groupId>de.control.fw.impctrl.bl</groupId>
         <artifactId>fw.impctrl.bl.execution-api</artifactId>
      </dependency>
```
       deswegen habe ich versucht ein Artifact oder Plugin aus dem Dependency zu erstellen damit ich an die Version kommen kann welches aber immer mit einer Fehlermeldung endete. (nicht zu wissen ob das überhaupt möglich ist macht es schwierig sich zu motivieren...)
     2. Alle Plugins sind selbst geschrieben und auf meinem Rechner gespeichert. Nun möchte ich zu jedem Anhängigkeit(quasi Plugin) den gespeicherten Ort finden (quasi den path) 
da habe ich allerdings auch meine Zweifeln ob das überhaupt geht...

Habt ihr für mich noch einpaar Tipps. Mir fehlt die Motivation weil ich einfach nicht weiss wie ich versuchen soll zu implementieren


----------



## kama (3. Aug 2010)

Hallo,



Daniel1000 hat gesagt.:


> 1. die Version rausfinden das geht nicht einfach weil die Version nicht in der Abhängigkeiten drin stehen z.B.
> 
> ```
> <dependency>
> ...


Wenn das eine gültige POM ist, dass sind dort Versionen. Entweder explizit was hier nicht der Fall ist, dann aber per Parent POM...



> 2. Alle Plugins sind selbst geschrieben und auf meinem Rechner gespeichert. Nun möchte ich zu jedem Anhängigkeit(quasi Plugin) den gespeicherten Ort finden (quasi den path)
> da habe ich allerdings auch meine Zweifeln ob das überhaupt geht...



Das erste ist das Project Object...

```
Set depArtifacts = project.getArtifacts();
```

Dann kannst Du über den Set iterieren und dann mit 
	
	
	
	





```
depArt.getFile().getAbsolutePath()
```
 den Pfad zu hohlen wo der Artefakt gespeichert ist...

Gruß
Karl Heinz Marbaise


----------



## Daniel1000 (4. Aug 2010)

eine letzte Frage:

Das Programm sieht nun so aus:

```
/**
 *
 * @goal searchear
 * 
 * @phase process-sources
 * @requiresProject false
 */
public class MyMojo
    extends AbstractMojo
{
	/**
	 * @parameter default-value="${project}" 
	 * @requiredProject false
	 * @readonly
	 */

	private MavenProject project  = null; 
	private Artifact cx;
	public void execute() throws MojoExecutionException, MojoFailureException {
		
		Model model = convertModel(new File("P:\\irek\\data_integration_1.02\\de.control.application.dataintegration-application.dataintegration.int-aggr\\ear-assembly\\pom.xml"));
		project = new MavenProject(model);
		
		Set depArt = project.getArtifacts();
		Iterator it = depArt.iterator();
		
		while(it.hasNext()){
			 cx = (Artifact)it.next();
			 System.out.println(cx.getFile().getAbsolutePath());
		}
	} 
	
	public Model convertModel(File pomFile){
		MavenXpp3Reader reader = new MavenXpp3Reader();
		
		Model model = null;
		try{
			model = reader.read(new FileReader(pomFile));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }
        return model;
	}
}
```

project.getArtifacts() gibt leider nichts zurück. Das ist wahrscheinlich weil ich neue pom.xml lese 
Muss ich jetzt doch neue Artifacts erstellen?


----------



## bygones (4. Aug 2010)

ich verstehs leider nicht... warum hast du in einem Plugin den festen pfad zu einer Pom ?

wie setzt du das plugin ein ?

(siehe beitrag im byte-welt forum) - wenn du ein Projekt haben willst dass du von kommandozeile haben willst brauchst du kein Mavenplugin...

warum fuegst du dein generisches plugin nicht in das projekt ein dessen pom du haben willst, dann brauchst du keine absoluten pfade zu irgendwelchen files.

sorry - verstehs net


----------



## Daniel1000 (4. Aug 2010)

Das ist ja auch das Problem. Es gibt kein Projekt. Die pom.xml ist sowas wie eine Zusammenfassung von der Mojos.
Das Plugin hat die Aufgabe alle Mojos zu finden die in Version "SNAPSHOT" enthalten und ihre path auszugeben . Das Plugin soll nacher vielmehr können aber erstmal nur das.

Das Plugin hat auch keine festen Pfad zum Pom, das habe fürs erste einfach so eingegeben


----------



## maki (4. Aug 2010)

Daniel1000, 

ich glaube bis jetzt hat  keiner kapiert was du eigentlich machen willst, ich lese diesen Thread und denke mir immer nur: Wozu?

Der "path" wie du ihn nennst ist doch irrelevant, könnte im lokalen Maven Repo stehen, wird zusammengesetzt aus groudId, artifactId, verison u.U. dem Classifier, aber wozu den "path" herausfinden???
Liegt es vielleciht daran, dass Maven2 nicht richtig verstanden wird?


----------



## Daniel1000 (4. Aug 2010)

Hi,
Das Plugin soll die Mojos bereitstellen, die noch keine feste version bekommen haben also die noch "SNAPSHOT" in version enthalten und ihre standort damit man nicht danach suchen muss denn es gibt wirklich viele davon...

Das mache ich für die Arbeit, was sie danach damit alles machen weiss ich nicht genau.


----------



## maki (4. Aug 2010)

Es gibt einen Report(Project Plugins), der die die verwendeten plugins samt Version auflistet und automatisch beid er Site generierung erstellt wird.
Maven Project Info Reports Plugin - project-info-reportslugins

Irgendwie werde ich den Eindruck nicht los dass hier das Rad neu erfunden wird, aber sehr eckig...


----------



## Daniel1000 (4. Aug 2010)

maki hat gesagt.:


> Irgendwie werde ich den Eindruck nicht los dass hier das Rad neu erfunden wird, aber sehr eckig...


Das Gefühl habe ich langsam auch 

das klappt nicht ((
Ich benutze die Plugins eigentlich nicht. Ich lese sie nur.

Gibt es eine Möglichkeit aus groupId und artifactId den "Artifact" zu finden sodass ich an die pfad rankommen kann oder die pom.xml so lesen zu lassen dass es sich die Artifacts gleich erstellt


----------



## maki (4. Aug 2010)

> Gibt es eine Möglichkeit aus groupId und artifactId den "Artifact" zu finden sodass ich an die pfad rankommen kann oder die pom.xml so lesen zu lassen dass es sich die Artifacts gleich erstellt


Wie ich bereits sagte, der "Pfad" hängt direkt mit den Koordinaten zusammen, den 2. Teil der Frage hab ich nicht verstanden, "artifacts erstellen" und wozu "pom.xml lesen"??


----------



## Daniel1000 (4. Aug 2010)

mit Artifact meine ich org.apache.maven.artifact.Artifact
das enthält alle nötigen Informationen.

das bekommt man eigentlich mit "project.getArtifacts()" was bei mir aber nur eine leere Liste liefert.
deswegen die Frage ob ich aus groupId und artifactId den Artifact selber finden kann


----------



## maki (4. Aug 2010)

Wieso Artifact?
Du meinst doch Plugins?


----------



## Daniel1000 (4. Aug 2010)

mit Artifact kann ich mit "getAbsolutePath()" den Pfad bekommen 
in Plugin ist sowas nicht drin


----------



## kama (4. Aug 2010)

Hallo,



Daniel1000 hat gesagt.:


> Das ist ja auch das Problem. Es gibt kein Projekt. Die pom.xml ist sowas wie eine Zusammenfassung von der Mojos.
> Das Plugin hat die Aufgabe alle Mojos zu finden die in Version "SNAPSHOT" enthalten und ihre path auszugeben . Das Plugin soll nacher vielmehr können aber erstmal nur das.
> 
> Das Plugin hat auch keine festen Pfad zum Pom, das habe fürs erste einfach so eingegeben


Also um mal etwas klarzustellen....Wenn Du ein Plugin schreibst, dann wird das in der Anwedung im Rahmen eines pom.xml verwendet dann hast Du eine Projekt eine POM etc. alles was man braucht.......weiterhin gibt es für so etwas Integrations-Tests (Habe ich glaube schon mal drauf hingewiesen)...

Wenn Du mit Maven eine release machst wird dass dich schon darauf aufmerksam machen, dass SNAPSHOT's enthalten sind und keine Release erstellen....

Mir scheint hier völlig unklar zu sein was das eigentliche Ziel der ganzen Geschichte ist...und die muss zuerst geklärt werden...und das Verständniss von Maven selbst scheint auch nocht nicht sehr weit gediegen zu sein....

Wenn Du einen Build gemacht hast mit Maven (mvn package) alle Abhängigkeiten hast Du dann im lokalen Repository (/home/.m2/repository)...

Gruß
Karl Heinz Marbaise


----------



## bygones (4. Aug 2010)

Fuer mich klingt das nach 

"Ich will ein Programm haben was mir eine bzw alle poms die irgendwo sind, herausfindet welche noch SNAPSHOT als Text drin stehen haben"

ja ?

dann lass bitte das als Mojo zu schreiben. Mach ein normales, stinkübliches Java Programm.



> Wenn Du ein Plugin schreibst, dann wird das in der Anwedung im Rahmen eines pom.xml verwendet dann hast Du eine Projekt eine POM etc. alles was man braucht


um nochmals hervorzuheben... Mojo NUR im Kontext einer POM


----------



## Daniel1000 (4. Aug 2010)

bygones hat gesagt.:


> Fuer mich klingt das nach
> 
> "Ich will ein Programm haben was mir eine bzw alle poms die irgendwo sind, herausfindet welche noch SNAPSHOT als Text drin stehen haben"
> 
> ...



stinkübliches Java Programm habe als erstes geschrieben aber das Programm brauchte einfach viel zu lange. Wir möchten das mit Mojo machen weil das gerade pom.xml ist und man nicht wie verrückt Orndner durchsuchen muss.
Also wenn ich jetzt den "Artifact" erstellen kann dann bin in 4-5 Zeilen fertig anstatt 40-50


----------



## maki (4. Aug 2010)

Daniel1000 hat gesagt.:


> stinkübliches Java Programm habe als erstes geschrieben aber das Programm brauchte einfach viel zu lange. Wir möchten das mit Mojo machen weil das gerade pom.xml ist und man nicht wie verrückt Orndner durchsuchen muss.
> Also wenn ich jetzt den "Artifact" erstellen kann dann bin in 4-5 Zeilen fertig anstatt 40-50


Nochmal:
Ein Artifakt ist etwas ganz anders als ein Plugin.
Ein Artifakt hat zwangsläufig einen Pfad im Dateisystem, ein Plugin nicht.
Was du willst geht nicht.


----------



## bygones (4. Aug 2010)

wenns dir um schnelligkeit bzw geringe anzahl von zeilen geht dann schreib ein bashskript ;-)

```
find . -name pom.xml | xargs grep SNAPSHOT
```


----------

