2008-12-31 7 views
5

Ich habe eine Java-Anwendung (Servlets) geerbt, die unter Tomcat läuft. Aus historischen Gründen hat der Code unterschiedliche "Look and Feel" -Optionen, je nachdem, wo die Anwendung bereitgestellt wird (im Wesentlichen eine Frage des Branding).Die beste Methode zum Ändern von Konstanten im Java-Buildprozess

Es gibt mehrere Konstanten, die diesen Branding-Prozess steuern, die unterschiedliche Funktionen haben und nicht zu einer einzigen Konstante (d. H. MARKE, MEHRSPRACHE plus die Positionen von Symbolen und CSS-Stylesheets usw.) verdichtet werden sollten.

Derzeit muss das Entwicklungsteam die Konstanten manuell ändern (sie sind mindestens in einer Datenklasse lokalisiert und gut dokumentiert), und kompilieren dann die Anwendung mithilfe von ANT neu.

Was ist der beste Weg, um diesen Prozess unter Annahme von mindestens Ant 1.8 und Java 6.x zu automatisieren?

Ich weiß, dass es keine guten Lösungen mit Compiler-Argumenten gab (wie man in C oder C++ tun kann), und lehne mich an "den besten Weg", entweder die Quelldatei mit den Konstanten zu bearbeiten oder sie zu setzen in eine andere Datei und tausche sie mit dem Ameise-Build-Prozess aus. Ich hätte gerne ein Ergebnis, das mit etwas wie "ant build brand-x" funktionieren würde, wo die Änderung der Marke den resultierenden Build verändern würde.

Danke,

-Richard

Antwort

2

die Aufgabe in Ant ersetzen Verwenden Sie die Werte zu ändern.

+0

Dies ist Brute-Force, aber es funktioniert. Die Datei wird jedoch überschrieben. Daher müssen Sie eine gespeicherte (oder eine Vorlage) Kopie der Datei erstellen und sie jedes Mal neu kopieren. -R- – Huntrods

+0

Follow-up ... Ich habe das genau seit dieser Antwort im Jahr 2008 verwendet und es hat perfekt funktioniert. Bei der Entwicklung kann ich das System 20 Mal pro Woche kompilieren und es ist großartig. (wenn das System nicht entwickelt wird, läuft es für Monate und Monate stabil). – Huntrods

1

Es gibt auch eine „spring“ Art und Weise, die eine Eigenschaft verwenden Datei und eine Bohne, die den Wert von den Eigenschaften zieht und injiziert sie in die Klassen, die sie benötigen, zum Beispiel:

<bean id="propertyPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="location" value="classpath:configuration.properties" /> 
</bean> 

und dann können Sie Eigenschaften mit einer „ant-like“ Syntax injizieren:

<bean id="connectionPool" class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource"> 
    <property name="databaseName" value="mydb" /> 
    <property name="url" value="${db.url}" /> 
    ... 

, die wahrscheinlich mehr Umschreiben mit sich bringen würde, als Sie möchten. Wenn Sie die Konstanten bei jedem Kompilieren ändern, würde ich auf dieses Problem achten (wenn Sie statische Finales verwenden).

public class Foo { 
public static final int SOME_CONSTANT=1; 
.. 
} 

public class Bar { 
    ... 
    int x=5+Foo.SOME_CONSTANT; 
    ... 
} 

Wenn Sie dann SOME_CONSTANT in Foo zu 2 ändern, aber nicht neu kompilieren Bar, Bar wird den Wert von 1 für SOME_CONSTANT behalten, da die statische Finale in kompiliert werden (da der Compiler, dass es sieht nicht soll müssen sie jemals wieder herausfinden).

1

Ich bevorzuge den expandproperties Filter der Ant anstelle der Ersetzungsaufgabe. Mit der Ersetzungstask neigt die Builddatei dazu, hauptsächlich zu tokenisieren. expandproperties lässt Sie ant-Eigenschaften direkt in Ihren Text einbetten.

<copy file="from" tofile="to"> 
    <filterchain> 
    <expandproperties /> 
    </filterchain> 
</copy> 
9

Setzen Sie Ihre Werte in eine Eigenschaftendatei, sagen Sie "myapp.Eigenschaften“und dann aus dem Classpath beim Start in den Konstanten laden (siehe unten, wie dies den Build-Prozess paßt in):

public class Constants 
{ 
    private static final Properties props = new Properties(); 
    public static final String MY_CONSTANT; 

    static 
    { 
     InputStream input = Constants.class.getResourceAsStream("/myapp.properties"); 
     if(input != null) 
     { 
      try 
      { 
       properties.load(input); 
      } 
      catch(IOException e) 
      { 
       // TODO log error 
      } 
     } 

     // Initialize constants (dont' forget defaults) 
     MY_CONSTANT = properties.getProperty("constant", "default"); 
     // .. other constants ... 
    } 
} 

Jetzt haben eine separaten Eigenschaften für jeden Branding-Datei Pass seinen Namen ANT. über -D oder build.properties und die Datei auf dem Build-Verzeichnis, um es zu kopieren rechts, bevor Sie Glas (oder Krieg).

Offensichtlich wird der Code über Arbeit, aber es gibt viele Möglichkeiten, wie Sie es reinigen und Machen Sie es kugelsicher

+0

Dies ist eine gute Lösung, aber funktioniert nicht für Nicht-String-Konstanten (Ich habe versucht - mehrere Möglichkeiten). Aus diesem Grund habe ich mich für die weniger elegante ant replace-Methode entschieden. -Richard – Huntrods

+0

Sie können nicht einfach eine Helpermethode "private static int getInt (String name, int def)" hinzufügen? Ich sehe keinen Grund, warum es nicht für Nicht-Strings funktionieren würde, zumindest mit etwas mehr Code. –

1

Ich habe eine Lösung, die nach Bedarf für diese besondere si funktioniert Unterhaltung. Ich habe der Ant ersetzt Aufgabe in Verbindung mit einer „gerettet“ Version der konstanten Klasse verwendet:

<target name="one" description="constant substitution #1"> 
    <delete file="./tme3/MyConst.java" /> 
    <copy file="./save/MyConst.java" tofile="./tme3/MyConst.java" /> 
    <replace file="./tme3/MyConst.java" token="@[email protected]" value="ONE_BRAND"/> 
    <replace file="./tme3/MyConst.java" token="@[email protected]" 
      value="../stylesheet/onebrand.css"/> 
    <replace file="./tme3/MyConst.java" token="@[email protected]" value="../images/onebrand.ico"/> 
    <replace file="./tme3/MyConst.java" token="@[email protected]" value="false"/> 
</target> 

ich nur diesen Block Kopien von und die Ersetzungen für die Fälle ändere Ich brauche - in meinem speziellen Fall sind jetzt 3 Sätze, aber mehr erwartet.

Vielen Dank für die tollen Antworten.

Verwandte Themen