Frage

Ich habe Konfigurationsdateien und verschiedene Dokumente, die ich von der Entwickler-Umgebung in das dev-Server-Verzeichnis mit Maven2 kopieren möge. Merkwürdigerweise hat Maven nicht stark scheint diese Aufgabe an.


Einige der Optionen:

  • Einfache Verwendung a Kopie Aufgabe in Maven
  

<copy file="src/main/resources/config.properties" tofile="${project.server.config}/config.properties"/>

  • Verwenden Sie die Ant-Plugin auszuführen Kopie von Ant.

  • ein Artefakt des Typs Construct zip , neben der "main" Artefakt des POM die in der Regel vom Typ Glas , dann auspacken das Artefakt aus dem Repository in das Zielverzeichnis.

  • Maven-Ressourcen Plugin, wie unten erwähnt.

  • Maven Assembly Plugin - aber dies scheint viel Hand Definitionen zu verlangen, wenn ich die Dinge tun will einfach und

  • "konventionell".
  • Diese Seite auch zeigt, wie ein Plugin bauen Kopieren zu tun!

  • Maven-Upload Plugin, wie unten erwähnt.

  • Maven-Abhängigkeit-Plugin mit Kopie , wie unten erwähnt.


Alle diese scheinen unnötig ad hoc: Maven soll bei tun, diese Standardaufgaben ohne viel Aufhebens zu übertreffen und die Mühe.

Jede Beratung?

War es hilfreich?

Lösung

Sie aus dem Antrun Plugin nicht scheuen. Nur weil einige Leute neigen dazu zu glauben, dass Ant und Maven in der Opposition sind, sind sie nicht. Verwenden Sie die Kopieraufgabe, wenn Sie einige unvermeidbare einmalige Anpassung ausführen müssen:

<project>
  [...]
  <build>
    <plugins>
      [...]
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <phase>deploy</phase>
            <configuration>
              <tasks>

                <!--
                  Place any Ant task here. You can add anything
                  you can add between <target> and </target> in a
                  build.xml.
                -->

              </tasks>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

Beantwortung dieser Frage, konzentriere ich mich auf die Details von dem, was Sie gefragt. Wie kopiere ich eine Datei? Die Frage und die Variablennamen führen mich zu einer größeren Fragen wie: „Gibt es einen besseren Weg, um mit Server-Bereitstellung umgehen?“ Verwenden Sie Maven als Build-System einsetzbares Artefakt zu erzeugen, dann diese Anpassungen führen entweder in separaten Modulen oder ganz woanders. Wenn Sie ein bisschen mehr von Ihrer Build-Umgebung gemeinsam genutzt, könnte es einen besseren Weg - es gibt Plugins für die Bereitstellung einer Anzahl von Servern. Könnten Sie eine Baugruppe anschließen, die in der Server-Wurzel ausgepackt? Welche Server verwenden Sie?

Noch einmal, ich bin sicher, es gibt einen besseren Weg.

Andere Tipps

<build>
    <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.3</version>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include> **/*.properties</include>
            </includes>
        </resource>
    </resources>
    ...
</build>

Um eine Datei Verwendung zu kopieren:

        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
                <execution>
                    <id>copy-resource-one</id>
                    <phase>install</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>

                    <configuration>
                        <outputDirectory>${basedir}/destination-folder</outputDirectory>
                        <resources>
                            <resource>
                                <directory>/source-folder</directory>
                                <includes>
                                    <include>file.jar</include>
                                </includes>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
           </executions>
        </plugin>

Um Ordner mit Unterordner verwenden nächste Konfiguration zu kopieren:

           <configuration>
              <outputDirectory>${basedir}/target-folder</outputDirectory>
              <resources>          
                <resource>
                  <directory>/source-folder</directory>
                  <filtering>true</filtering>
                </resource>
              </resources>              
            </configuration>  

Die Maven Abhängigkeit Plugin hat mich gerettet viel Zeit mit ant Aufgaben Streicheln:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>install-jar</id>
            <phase>install</phase>
            <goals>
                <goal>copy</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>...</groupId>
                        <artifactId>...</artifactId>
                        <version>...</version>
                    </artifactItem>
                </artifactItems>
                <outputDirectory>...</outputDirectory>
                <stripVersion>true</stripVersion>
            </configuration>
        </execution>
    </executions>
</plugin>

Die Abhängigkeit: Kopieren documentend ist, und hat mehr nützliche Ziele wie auspacken.

Für eine einfache Kopie-Aufgaben kann ich copy-umbenennen-Maven-Plugin empfehlen . Es ist einfach und einfach zu bedienen:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>com.coderplus.maven.plugins</groupId>
        <artifactId>copy-rename-maven-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <id>copy-file</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
              <sourceFile>src/someDirectory/test.environment.properties</sourceFile>
              <destinationFile>target/someDir/environment.properties</destinationFile>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

Wenn Sie möchten, dass mehr als eine Datei kopieren, ersetzen Sie den <sourceFile>...</destinationFile> Teil mit

<fileSets>
  <fileSet>
    <sourceFile>src/someDirectory/test.environment.properties</sourceFile>
    <destinationFile>target/someDir/environment.properties</destinationFile>
  </fileSet>
  <fileSet>
    <sourceFile>src/someDirectory/test.logback.xml</sourceFile>
    <destinationFile>target/someDir/logback.xml</destinationFile>
  </fileSet>                
</fileSets>

Darüber hinaus können Sie mehrere Ausführungen in mehreren Phasen angeben, wenn nötig, das zweite Ziel ist „umbenennen“, was einfach das tut, was er sagt, während der Rest der Konfiguration gleich bleibt. Weitere Beispiele für die Verwendung auf die Usage-Seite beziehen.

Hinweis : Dieses Plugin kann nur Dateien kopieren, keine Verzeichnisse. (Danke an @ james.garriss für diese Einschränkung zu finden.)

Die Ameise Lösung oben ist am einfachsten zu konfigurieren, aber ich habe Glück hat die Maven-Upload-Plugin von Atlassian verwenden. Ich war nicht in der Lage eine gute Dokumentation zu finden, hier ist, wie ich es verwenden:

<build>
  <plugin>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-upload-plugin</artifactId>
    <version>1.1</version>
    <configuration>
       <resourceSrc>
             ${project.build.directory}/${project.build.finalName}.${project.packaging}
       </resourceSrc>
       <resourceDest>${jboss.deployDir}</resourceDest>
       <serverId>${jboss.host}</serverId>
       <url>${jboss.deployUrl}</url>
     </configuration>
  </plugin>
</build>

Die Variablen wie "$ {jboss.host}" oben referenzierten definiert sind in meiner ~ / .m2 / settings.xml und werden mit Maven Profile aktiviert. Diese Lösung ist nicht auf JBoss beschränkt, das ist genau das, was ich meine Variablen genannt. Ich habe ein Profil für Entwickler, zu testen und zu Hause ist. Also mein Ohr auf eine JBoss-Instanz in der Testumgebung laden ich ausführen würde:

mvn upload:upload -P test

Hier ist ein snipet von settings.xml:

<server>
  <id>localhost</id>
  <username>username</username>
  <password>{Pz+6YRsDJ8dUJD7XE8=} an encrypted password. Supported since maven 2.1</password>
</server>
...
<profiles>
  <profile>
    <id>dev</id>
    <properties>
      <jboss.host>localhost</jboss.host> 
      <jboss.deployDir>/opt/jboss/server/default/deploy/</jboss.deployDir>
      <jboss.deployUrl>scp://root@localhost</jboss.deployUrl>
    </properties>
  </profile>
  <profile>
    <id>test</id>
    <properties>
       <jboss.host>testserver</jboss.host>
       ...

Weitere Informationen: Die Atlassian Maven Repo, die dieses Plugin hat, ist hier: https://maven.atlassian.com/public/

Ich empfehle die Quellen herunterladen und in der Dokumentation suchen im Inneren alle sehen die Eigenschaften das Plugin zur Verfügung stellt.

`

Nun, Maven soll nicht dabei feingranularen Aufgaben gut sein, ist es nicht eine Skriptsprache wie bash oder Ameise ist, ist es eher deklarativen - Sie sagen - ich brauche einen Krieg oder ein Ohr, und Sie es . Wenn Sie jedoch müssen anpassen, wie der Krieg oder Ohr wie innen aussehen soll, haben Sie ein Problem. Es ist einfach nicht verfahrens wie Ameise, aber deklarativen. Dies hat einige Profis am Anfang, und könnte eine Menge Nachteile am Ende hat.

Ich denke, das ursprüngliche Konzept feine Plugins zu haben war, dass „einfach funktionieren“, aber die Realität ist anders, wenn Sie nicht-Standard-Sachen zu tun.

Wenn Sie jedoch genug Mühe in Ihre Poms und einige benutzerdefinierte Plug-Ins, werden Sie eine Build-Umgebung viel besser als mit Ameise zum Beispiel (hängt von Ihnen Projekt natürlich, aber es wird mehr und mehr gilt für größere Projekte) .

Ich habe sehr gute Erfahrungen mit copy-Maven-Plugin . Es hat eine viel bequeme und prägnante Syntax im Vergleich zu maven-Ressourcen-Plugin.

Eine generische Art und Weise beliebige Dateien zu kopieren, ist auf Maven Wagon Transport Abstraktion zu nutzen. Es kann verschiedene Ziele über Protokolle wie file, HTTP, FTP, SCP oder WebDAV behandeln.

Es gibt einige Plugins, die Einrichtungen zum Kopieren von Dateien durch die Verwendung von Wagon bieten. Am bemerkenswertesten sind:

  • Out-of-the-box Maven Plugin bereitstellen

    Es ist das deploy-file Ziel . Es sich recht unflexibel, sondern kann den Job erledigen:

    mvn deploy:deploy-file -Dfile=/path/to/your/file.ext -DgroupId=foo 
    -DartifactId=bar -Dversion=1.0 -Durl=<url> -DgeneratePom=false
    

    Signifikante Nachteil Maven Deploy Plugin zu verwenden ist, dass es bestimmt ist mit Maven-Repositories zu arbeiten. Er geht davon aus besonderer Struktur und Metadaten. Sie können sehen, dass die Datei unter foo/bar/1.0/file-1.0.ext und Prüfsummen-Dateien werden erstellt, platziert wird. Es gibt keinen Weg, um dieses.

  • Wagon Maven Plugin

    Mit dem upload-single Ziel :

    mvn org.codehaus.mojo:wagon-maven-plugin:upload-single
    -Dwagon.fromFile=/path/to/your/file.ext -Dwagon.url=<url>
    

    Die Verwendung von Wagon Maven Plugin für das Kopieren ist einfach und scheint das vielseitigste zu sein.


In den obigen Beispielen <url> kann von jedem unterstützten Protokoll sein. Siehe die Liste der vorhandenen Wagon Providers . Zum Beispiel

  • Kopieren Datei lokal: file:///copy/to
  • Kopieren der Datei auf Remote-Host ausgeführt SSH: scp://host:22/copy/to


Die obigen Beispiele Pass Plugin-Parameter in der Befehlszeile. Alternativ können Plugins direkt in POM konfiguriert werden. Dann wird der Aufruf einfach wie mvn deploy:deploy-file@configured-execution-id sein. Oder es kann auf bestimmte Aufbauphase gebunden werden.


Bitte beachten Sie, dass für Protokolle wie SCP Sie arbeiten müssen eine Erweiterung in Ihrem POM definieren:

<build>
  [...]
  <extensions>
    <extension>
      <groupId>org.apache.maven.wagon</groupId>
      <artifactId>wagon-ssh</artifactId>
      <version>2.12</version>
    </extension>
  </extensions>


Wenn das Ziel, das Sie kopieren, um eine Authentifizierung erfordert, können Anmeldeinformationen zur Verfügung gestellt werden über Server Einstellungen . repositoryId / serverId zu den Plugins übergeben muß die Server in den Einstellungen definiert entsprechen.

Ich kann nur annehmen, dass Ihr $ {project.server.config} Eigenschaft etwas benutzerdefinierten definiert und außerhalb der Standard-Verzeichnisstruktur ist.

Wenn ja, dann würde ich die Kopie Aufgabe verwenden.

Eine andere Möglichkeit ist, diese Dinge in ein Artefakt mit der Montage-Plugin zu bündeln. Dann können Sie die Abhängigkeit Plugin verwenden, um diese Dateien zu entpacken, wo Sie wollen. Es gibt auch kopieren Ziele in der Abhängigkeit Plugin Artefakte zu kopieren.

Ich war in der Lage eine Reihe von verschiedenen Quellen für diese Antwort Stück zusammen:

...
<repository>
    <id>atlassian</id>
    <name>Atlassian Repo</name>
    <url>https://maven.atlassian.com/content/repositories/atlassian-public</url>
</repository>
...
<dependency>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-upload-plugin</artifactId>
    <version>1.1</version>
</dependency>
...
<plugin>
    <groupId>com.atlassian.maven.plugins</groupId>
    <artifactId>maven-upload-plugin</artifactId>
    <version>1.1</version>
    <configuration>
        <serverId>jira-repo</serverId>
        <resourceSrc>
            ${project.build.directory}/${project.build.finalName}.${project.packaging}
        </resourceSrc>
        <resourceDest>opt/jira/webapps</resourceDest> <!-- note: no leading slash -->
        <url>scp://root@jira</url>
    </configuration>
</plugin>
...

Von ~/.m2/settings.xml:

...
<servers>
  <server>
    <id>jira-repo</id>
    <username>myusername</username>
    <password>mypassword</password>
  </server>
</servers>
...

Dann den Befehl ausführen: (die -X für debug)

mvn -X upload:upload

, um einige der feinen Antworten oben zusammenfassen: Maven ist so konzipiert, Module zu bauen und die Ergebnisse in einer Maven-Repository zu kopieren. Jegliches Kopieren von Modulen zu einem Deployment / installer-Eingabeverzeichnis muss außerhalb des Kontextes von Maven Kernfunktionalität durchgeführt werden, z.B. mit dem Ant / Maven Kopieren Befehl.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top