2014-02-12 7 views
5

Ich bin neu in Maven. Ich entschuldige mich, wenn das eine dumme Frage ist. Ich habe ein Maven Eclipse-Projekt mit einer Pom-Datei, die mit dem Schatten-Plugin ein lauffähiges Glas erstellt. Mein Plan ist, eine von mehreren Eigenschaftendateien im Bau zu enthalten (korrigiere mich bitte, wenn meine Terminologie falsch ist. Ich bin wirklich grün). Ich habe mehrere Eigenschaftendateien in src/main/resources.Verwenden von verschiedenen Eigenschaften Dateien für ausführbare Gläser, Maven Eclipse

Ich möchte einen Weg finden, in das ausführbare jar nur die Eigenschaftendatei zu integrieren, die gilt. Insbesondere habe ich zwei Eigenschaftendateien (config1.properties, config2.properties) in meinem Projekt und jeder Build wird nur eine dieser Dateien verwenden, abhängig von der gewünschten Funktionalität des resultierenden Jar. Der Properties-Datei wird ein generischer Name zugewiesen, insbesondere "defaultconfig.properties", damit sie gut mit dem Code abgespielt wird.

Die resultierenden JAR-Dateien (eine andere für jede unterschiedliche Eigenschaftendatei) werden als separate Cron-Jobs ausgeführt. Ich denke, dass ich verschiedene Jenkins-Projekte verwenden werde, um die ausführbaren Jars auf bestimmten Servern zu verteilen, basierend darauf, für welche Aufgabe die Eigenschaftendatei das Projekt konfiguriert (ich glaube, ich hatte diesen Teil). Die Cron-Jobs werden auf diesen Servern ausgeführt.

meine Fragen sind:

1), wobei sich die Logik gehen, die bestimmt, welche Eigenschaften in der runnable jar enthalten Datei?

Beispiel: Ich habe config1.properties (das angibt, dass var1 = blah und var2 = blip und var3 = boink) und config2.properties (das angibt, dass var1 = duh var2 = dip und var3 = doink) . Wo kann ich Maven mitteilen, welche dieser beiden Dateien für bestimmte Builds verwendet werden sollen?

2) soll ich einen Parameter übergeben, der Maven mitteilt, welche Eigenschaftendatei zu verwenden ist? Wenn ja, an wen überlasse ich diesen Parameter auch? Ist das etwas, das in einem Jenkins-Projekt konfiguriert werden kann? (Auch wenn ich nicht sicher bin, ob dies ein Maven-Problem oder ein Jenkins-Problem sein würde.)

Hier ist ein relevanter Teil meiner pom.xml Datei:

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.2</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>com.foo.dashboard.bar.Runner</mainClass> 
          </transformer> 
         </transformers> 
         <finalName>FooBar</finalName> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

ich habe mit IncludeResourceTransformer versucht, die Eigenschaften umbenennen Datei und war aber nicht sicher, wie die Logik enthält, für Dateien basierend auf gewünschte jAR-Datei Funktionalität Eigenschaften wechseln.

Vielen Dank.

+1

suchen Sie so etwas? http://rajendra.wordpress.com/2012/02/22/maven-filtering-resources-conditional-while-packaging/ – DevZer0

+1

Ich denke, was Sie brauchen, sind * Profile *: Sie können mehrere von ihnen definieren und jeder von ihnen kann Definieren Sie die gleiche Eigenschaft mit unterschiedlichen Werten. Dann können Sie die Eigenschaft verwenden, um anzugeben, welche Eigenschaftendateien Sie in Ihren aktuellen Build aufnehmen müssen. – rlegendi

+0

@ DevZer0 - Dies scheint einen Teil meines Wunsches zu beantworten, nämlich eine Möglichkeit zur Verfügung zu stellen, die Eigenschaftendateien anzupassen, die während des Builds verwendet werden. Genial. Ein paar Follow-up-Fragen. Ich bemerke, dass die Ressource Tag ein Boolescher ist. Was wäre, wenn es mehr als 2 Konfigurationsmöglichkeiten gäbe? Und da dies eine Möglichkeit bietet, zwischen Konfigurationen zu wechseln, wie geben Sie den Wert an, der beim Generieren der JAR-Datei verwendet werden soll? –

Antwort

1

Das ist, was ich mir ausgedacht habe. Ich würde gerne andere Ansätze kennenlernen oder den besten Weg, dies zu tun. Für all das völlig neu zu sein.

  1. Erstellen Sie separate Ausführungen im selben Plugin. Hinweis: Sie müssen verschiedene <id> Werte zugewiesen bekommen.
  2. Jede <execution> kann anders konfiguriert werden. Verwenden Sie zum Umbenennen der Ressourcen, die Sie einschließen, <transfomer> implementation = implementation = "org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">.
  3. Um Ressourcen auszuschließen, die nicht benötigt werden (in meinem Fall andere Eigenschaftendateien), verwenden Sie <transformer> implementation = "org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">. Das ist mehr Feingefühl als Notwendigkeit. Warum bündeln Sie nicht benötigte Dateien in Ihrem Glas?
  4. Stellen Sie sicher, dass jede <execution> eine andere <finalName> hat, so dass die resultierenden Gläser einander nicht überschreiben.

Hier ist meine Pom-Datei.

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.2</version> 
      <executions> 
       <execution> 
        <id>ID1</id> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>com.foo.dashboard.bar.Runner</mainClass> 
          </transformer> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer"> 
           <resource>defaultconfig.properties</resource> 
           <file>src/main/resources/defaultconfig_1.properties</file> 
          </transformer> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer"> 
           <resource>defaultconfig_2.properties</resource> 
          </transformer> 
         </transformers> 
         <finalName>FooBar1</finalName> 
        </configuration> 
       </execution> 
       <execution> 
        <id>ID2</id> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>com.foo.dashboard.bar.Runner</mainClass> 
          </transformer> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer"> 
           <resource>defaultconfig.properties</resource> 
           <file>src/main/resources/defaultconfig_2.properties</file> 
          </transformer> 
          <transformer 
           implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer"> 
           <resource>defaultconfig_1.properties</resource> 
          </transformer> 
         </transformers> 
         <finalName>FooBar2</finalName> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

Ich weiß, das ist nicht die endgültige Antwort, da diese Erträge mehrere JAR-Dateien einrichten und ich ursprünglich war auf der Suche nach einer Lösung, die mir nur die JAR-Datei mit einem bestimmten Eigenschaften zugeordnet geben würde Datei, die nicht alle die JAR-Dateien aus allen Eigenschaftendateien.

Also nehme ich noch Vorschläge, wie man diese Lösung verbessern kann, so dass der Build nur ein einziges Glas ergeben würde.

Verwandte Themen