Maven (Verständnis-)frage

Status
Nicht offen für weitere Antworten.

-MacNuke-

Bekanntes Mitglied
Hi.

Ich arbeite mich gerade etwas in Maven2 ein und hab da eine Frage.

Mein damaliges Ant-Projekt läuft soweit schon fast komplett in Maven... aber ich hätte gerne noch ein paar Sachen, wo ich keine Antwort gefunden habe.

Darum mal eine Frage.

In Ant hatte ich damals ein Task, wo ich den HSQL Datenbankmanager gestartet habe. Der hat einfach die Java-Klasse aufgerufen und es ging.

Geht das in Maven auch irgendwie? Weil irgendwie dreht sich da ja alles um Lifecycle-Phasen und ich will eigentlich nicht andauernd den Datenbank-Manager aufrufen. 😉 Das betrifft auch noch ein paar mehr Tasks, wie z.B. der Shemaexport von Hibernate usw. Der wird jetzt andauernd aufgerufen (ist in process-classes), obwohl ich den nur optional brauche. Der braucht aber natürlich die abhängigen Phasen davor (compile, usw.)

Gibt's für sowas ein Plugin?

Vielen Dank und noch frohe Weihnachten 🙂
 
MIt dem ant-run plugin kan man Ant tasks ausführen.

Jedes Plugin kann man konfigurieren, in der execution sektion kann man festlegen, zu in welcher Phase es (bzw. was) ausgeführt wird.

Zeig mal deine POM bzw. die relevanten Teile davon.
 
maki hat gesagt.:
MIt dem ant-run plugin kan man Ant tasks ausführen.

Jedes Plugin kann man konfigurieren, in der execution sektion kann man festlegen, zu in welcher Phase es (bzw. was) ausgeführt wird.

Zeig mal deine POM bzw. die relevanten Teile davon.[/quote

Also meine POM sieht so aus:


Code:
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.firma.general</groupId>
    <artifactId>GebaeudeVerwaltung</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>
    <name>GebaeudeVerwaltung</name>
    <url>http://maven.apache.org</url>
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <executable>java</executable>
                    <workingDirectory>${project.build.directory}/dist</workingDirectory>
                    <arguments>
                        <argument>-jar</argument>
                        <argument>${project.build.finalName}.jar</argument>
                    </arguments>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <configuration>
                    <filesets>
                        <fileset>
                            <directory>${basedir}/resources/data</directory>
                        </fileset>
                    </filesets>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>generate-ddl</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <property name="compile_classpath" refid="maven.compile.classpath"/>
                                <ant antfile="${basedir}/build.xml" inheritRefs="true">
                                    <target name="generateDDL" />
                                </ant>
                            </tasks>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/dist/dependency</outputDirectory>
                            <excludeScope>provided</excludeScope>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <executions>
                    <execution>
                        <id>jar</id>
                        <phase>package</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                        <configuration>
                            <archive>
                                <manifest>
                                    <classpathPrefix>dependency/</classpathPrefix>
                                    <addClasspath>true</addClasspath>
                                    <mainClass>com.firma.general.Main</mainClass>
                                </manifest>
                            </archive>
                            <outputDirectory>${project.build.directory}/dist</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.3</version>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/dist/resources</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>${basedir}/resources</directory>
                                </resource>
                            </resources>
                            <includeEmptyDirs>true</includeEmptyDirs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>com.miglayout</groupId>
            <artifactId>miglayout</artifactId>
            <version>[3.6,)</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <version>1.8.0.7</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>3.3.1.GA</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-annotations</artifactId>
            <version>3.4.0.GA</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-tools</artifactId>
            <version>3.2.0.ga</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>3.3.1.GA</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.5.2</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.8.0.GA</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>

Wie gesagt, so an sich funktioniert das bestens. Es geht an sich nur um die Frage, ob ich Sachen Definieren kann die mit diesem Build-Lifecycle überhaupt nichts zu tun haben. Also quasi so wie in Ant.

Nehmen wir den Shemaexport als Beispiel. Der ist ja in Process-Classes eingetragen, im Antrun Teil. D.h. wenn ich mvn package aufrufe, wird auch dieses Process-Classes aufgerufen. Nun ist meine Frage, ob ich das auch irgendwo eintragen kann, das es immer nur optional ist. D.h. ich muss es explizit über die Kommandozeile aufrufen, ansonsten wird es nie aufgerufen. Aber wenn ich es aufrufe, muss er halt erst compilieren usw...
 
Hallo,

die Ant-Task zum erstellen der DDL aus Hibernate heraut...dazu gibt es auch ein Maven Plugin was dass kann..

Hier mal ein Beispiel.
Code:
<plugin>                
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>hibernate3-maven-plugin</artifactId>
  <version>2.1</version>
  <executions>  
    <execution> 
      <id>hbm2ddl</id>
      <phase>process-classes</phase>
      <goals>           
        <goal>hbm2ddl</goal>
      </goals>              
    </execution>            
  </executions>         
  <configuration>   
    <components>
      <component>   
        <componentProperties>
          <jdk5>true</jdk5>
          <packagename>de.dieFirma.bo</packagename>
          <console>false</console>
          <outputfilename>schema.sql</outputfilename>
          <drop>false</drop>
          <create>true</create>
          <update>false</update>
          <export>false</export>
          <format>true</format>
        </componentProperties>
      </component>
    </components>
  </configuration>
  <dependencies>
    <dependency>
      
      <groupId>${database.pom.groupId}</groupId>
      <artifactId>${database.pom.artifactId}</artifactId>
      <version>${database.pom.version}</version>
    </dependency>
  </dependencies>
</plugin>
Im Bereich Dependency kann man dann noch die Datenbank einsetzen, die man nutzt....

Der Outputfilename muss nicht definiert werden, kann man aber....

Weiterhin solltest Du dicht mit dem Konzept: Konvention vor Konfiguration genau auseinander setzen, da Du an vielen Stellen noch Konfigurationen vornimmst die nicht notwendig sind und vor allem aber hinderlich sind....


Warum rust Du das exec-maven-plugn zur Erstellung eines ".jar" auf ? Schon mal mvn package versucht ? Dein package type ist ja schon "jar"....

Warum nutzt Du das maven-clean-plugin, um noch ein "resources/data" verzeichnis zu löschen? Das ziel Verzeichnis für Operationen von Maven ist nun mal "target" und ein mvn clean löscht das alles ....

Weiterhin sehe ich die Konfiguration des maven-dependency-plugin um ein "dist/dependency" Verzeichnis mit den Dependencies zu füllen ? Hast Du dich schon mal mit dem Maven - Assembly PlugIn beschäftigt...

Die gibtst dem maven-jar-plugin wieder ein zusätzliches Verzeichnis ".../dist" ? Warum nicht die Maven Konvention "../target" nutzen ? und wozu gibt es mvn install bzw. mvn deploy ?


Wenn Du schon PlugIns konfigurierst (compiler plugin) dann mach die Konfiguration in einem einzigen Abschnitt und nicht über mehrere Bereiche Verteilt....

Könntest Du vielleicht noch schreiben was das für ein Projekt wird ? Web Application ? EJB ? JBoss / Tomcat etc. Projekt ?

Vieleicht kann ich da noch etwas zu schreiben ....

MfG
Karl Heinz Marbaise
 
Es tut mir Leid, wenn das alles etwas konfus aussieht, aber ich lerne ja maven gerade erst kennen...

kama hat gesagt.:
Hallo,
die Ant-Task zum erstellen der DDL aus Hibernate heraut...dazu gibt es auch ein Maven Plugin was dass kann..

Danke, werde ich mir mal anschauen.

kama hat gesagt.:
Warum rust Du das exec-maven-plugn zur Erstellung eines ".jar" auf ? Schon mal mvn package versucht ? Dein package type ist ja schon "jar"....

Tue ich nicht. Das maven exec Plugin startet das jar. Erstellen tue ich es mit package

kama hat gesagt.:
Warum nutzt Du das maven-clean-plugin, um noch ein "resources/data" verzeichnis zu löschen? Das ziel Verzeichnis für Operationen von Maven ist nun mal "target" und ein mvn clean löscht das alles ....

Weil in meiner hibernate.cfg.xml als HSQL File Datenbank file://resources/data drinnen steht. Und wenn HSQL dann die Datenbanken anlegt, landen die im resources/data Ordner und nicht im target-Ordner. Den kopiere ich dann in mein dist-Verzeichnis

kama hat gesagt.:
Weiterhin sehe ich die Konfiguration des maven-dependency-plugin um ein "dist/dependency" Verzeichnis mit den Dependencies zu füllen ? Hast Du dich schon mal mit dem Maven - Assembly PlugIn beschäftigt...

Ja, da war ich so erfolgreich, dass es mir irgendwie ein jar erstellt hat, was richtig fett war und nicht lief 😉

kama hat gesagt.:
Die gibtst dem maven-jar-plugin wieder ein zusätzliches Verzeichnis ".../dist" ? Warum nicht die Maven Konvention "../target" nutzen ? und wozu gibt es mvn install bzw. mvn deploy ?

Ich dachte mvn install installiert das Projekt in das Maven Repo? deploy kenne ich noch nicht.


kama hat gesagt.:
Wenn Du schon PlugIns konfigurierst (compiler plugin) dann mach die Konfiguration in einem einzigen Abschnitt und nicht über mehrere Bereiche Verteilt....

Öhm, das mit dem Compiler war NetBeans 😀

kama hat gesagt.:
Könntest Du vielleicht noch schreiben was das für ein Projekt wird ? Web Application ? EJB ? JBoss / Tomcat etc. Projekt ?

Java Swing Anwendung.


Vllt. noch ein paar Worte dazu:

- ich will die Hibernate.cfg.xml NICHT im jar drinnen haben. Hier will ich ggf. Optionen ändern. Darum soll die extern in einem Ordner liegen (darum das angepasste copy-resources)

- die Datenbanken die mir der Shemaexport erstellt, landen ja, wie gesagt, nicht im Target-Ordner (file Definition in der Hibernate.cfg). Die Anwendung soll aber aus dem dist-Ordner (der ja im target-Ordner liegt) komplett startbar/auslieferbar sein. Dazu brauche ich ja die config, die Datenbank, die Deps und das jar. (darum das angepasste clean- und das angepasste jar-Plugin)

- ich will die Deps nicht im jar drinnen haben. Wenn ich ein Update schicke, muss ich ja nicht jedesmal die Deps neu mitschicken. So ist das jar nur 90kb groß, statt 6MB. (darum hab ich mich nach Tests nicht weiter mit assembly beschäftigt)

edit:
Nebenbei steht immernoch die Frage nach separat aufrufbaren Tasks 😉
 
Hallo,
-MacNuke- hat gesagt.:
Es tut mir Leid, wenn das alles etwas konfus aussieht, aber ich lerne ja maven gerade erst kennen...
Bei mir sah das am Anfang auch nicht besser aus...also das ist kein Problem....


-MacNuke- hat gesagt.:
kama hat gesagt.:
Warum rust Du das exec-maven-plugn zur Erstellung eines ".jar" auf ? Schon mal mvn package versucht ? Dein package type ist ja schon "jar"....
Tue ich nicht. Das maven exec Plugin startet das jar. Erstellen tue ich es mit package
Oh mist...da konnte ich nicht lesen....

-MacNuke- hat gesagt.:
kama hat gesagt.:
Warum nutzt Du das maven-clean-plugin, um noch ein "resources/data" verzeichnis zu löschen? Das ziel Verzeichnis für Operationen von Maven ist nun mal "target" und ein mvn clean löscht das alles ....

Weil in meiner hibernate.cfg.xml als HSQL File Datenbank file://resources/data drinnen steht. Und wenn HSQL dann die Datenbanken anlegt, landen die im resources/data Ordner und nicht im target-Ordner. Den kopiere ich dann in mein dist-Verzeichnis
Hm...da wäre zu überlegen, ob Du das Konzept umstellst...Du möchtest die Datenbank ja zu deiner Applikation haben...somit würde ich es so machen und ein tar.gz oder ZIP File ausliefern, wo die Datenbank mit enthalten ist...Dann kannst Du einfach mehrere Versionen der Applikation parallel laufen lassen...

-MacNuke- hat gesagt.:
kama hat gesagt.:
Weiterhin sehe ich die Konfiguration des maven-dependency-plugin um ein "dist/dependency" Verzeichnis mit den Dependencies zu füllen ? Hast Du dich schon mal mit dem Maven - Assembly PlugIn beschäftigt...
Ja, da war ich so erfolgreich, dass es mir irgendwie ein jar erstellt hat, was richtig fett war und nicht lief 😉
Ok. Dann hast Du schlicht die Dependencies mit genommen...Du kannst ja ein Paket machen (z.B. zip-Datei) wo alles drin ist eines nur dein Jar etc.....

-MacNuke- hat gesagt.:
kama hat gesagt.:
Die gibtst dem maven-jar-plugin wieder ein zusätzliches Verzeichnis ".../dist" ? Warum nicht die Maven Konvention "../target" nutzen ? und wozu gibt es mvn install bzw. mvn deploy ?
Ich dachte mvn install installiert das Projekt in das Maven Repo? deploy kenne ich noch nicht.
Ja Du hast Recht...ich habe mich vertan...mvn package paketiert alles im target Verzeichnis...deploy installiert im remote Repository...Das dist Verzeichnis ist aber nicht notwendig...denn mit mvn package wird alles erstellt und im target Ordner abgelegt.

-MacNuke- hat gesagt.:
kama hat gesagt.:
Wenn Du schon PlugIns konfigurierst (compiler plugin) dann mach die Konfiguration in einem einzigen Abschnitt und nicht über mehrere Bereiche Verteilt....
Öhm, das mit dem Compiler war NetBeans 😀
Ich gebe Dir den Tipp versuche das erst OHNE Netbeans oder sonst wen zu erstellen und wenn Du verstanden hast wie es funktioniert kann man sich die Arbeit ruhig abnehmen lassen...


-MacNuke- hat gesagt.:
- ich will die Hibernate.cfg.xml NICHT im jar drinnen haben. Hier will ich ggf. Optionen ändern. Darum soll die extern in einem Ordner liegen (darum das angepasste copy-resources)
Bekanntes und typische Anforderungen...also ein ZIP oder .tar.gz erstellen wo eine Verzeichnisstruktur enthalten ist und die hibernate.cfg.xml entsprechend abgelegt ist....dort ist dann ein bat/cmd/sh file zum starten....

-MacNuke- hat gesagt.:
Nebenbei steht immernoch die Frage nach separat aufrufbaren Tasks 😉
Die Frage ist wozu Du die brauchst bzw. was Du damit machen möchtest?

Bei der Nutzung von Maven benötigt man so etwas nicht mehr....

EDIT: Maven Buch zum Lesen sehr zu empfehlen...
MfG
Karl Heinz Marbaise
 
kama hat gesagt.:
Die Frage ist wozu Du die brauchst bzw. was Du damit machen möchtest?

In Ant hab ich damit z.B. den Datenbank-Manager von HSQLDB gestartet. Oder den Shemaexport separat gelegt. Bei anderen Projekten arbeite ich mit einer MySQL Datenbank und da wäre ein ständiges erstellen der Datenbank ziemlich lästig, nur weil ich ein jar erstellen will. ;-) Weil die Datenbank ändert sich nicht soooooo oft.

Aber mal schauen. Vllt. packe ich solche Sachen auch in eine build.xml und nutze Maven und Ant..., sofern das gewünschte nicht funktioniert...
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben