Frage

Ich habe eine Java-Anwendung (Servlets) geerbt, die unter Tomcat läuft. Aus historischen Gründen hat der Code anders „Look and Feel“ Optionen auf, wo wird die Anwendung (im Wesentlichen eine Frage des Branding) eingesetzt werden.

Es gibt mehrere Konstanten, die dieses Branding-Prozess zu steuern, die verschiedene Funktionen haben und nicht in eine einzige Konstante verdichtet werden sollte (dh BRAND, MULTI-Sprache, sowie die Standorte von Icons und CSS-Stylesheets, usw.).

Zur Zeit das Entwicklungsteam muss manuell die Konstanten ändern (sie zumindest in einer Datenklasse lokalisiert und gut dokumentiert), dann neu kompiliert die Anwendung ANT verwendet wird.

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

zu automatisieren

Ich weiß, dass es nicht gewesen sein keine guten Lösungen Compiler verwendet Argumente (wie ein in C oder C ++ tun könnte), und bis zu einem gewissen „besten Weg“ bin Neigung entweder die Quelldatei, die Konstanten zu bearbeiten enthält, oder sie in Putten eine andere Datei und tauschen sie aus den ant-Build-Prozess. Ich möchte ein Ergebnis haben, die wie „ant build brand-x“ mit so etwas funktionieren würde, wo die Marke Änderung der resultierenden Build ändern würde.

Danke,

-Richard

War es hilfreich?

Lösung

Mit der ersetzen Aufgabe in Ant, um die Werte zu ändern.

Andere Tipps

Setzen Sie Ihre Werte in eine Eigenschaftendatei „myapp.properties“ sagen und sie dann lädt in den Konstanten aus dem Classpath beim Start (siehe unten, wie dies paßt in den Build-Prozess):

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 ...
    }
}

Nun haben eine separate Eigenschaften für jede Branding-Datei. Pass seinen Namen ANT über -D oder build.properties und kopieren Sie die Datei auf dem Build-Verzeichnis rechts, bevor Sie jar (oder war) es auf.

Offensichtlich wird der Code über Arbeit, aber es gibt viele Möglichkeiten, wie Sie es aufzuräumen und es kugelsicher machen.

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, z.

<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 vorhaben, Konstanten auf jeder Kompilierung zu ändern, würde ich aufpassen, für diesen gotcha (wenn Sie statisches Finale verwenden, das ist).

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 sieht, dass es nicht immer Figur braucht sie wieder heraus).

Ich ziehe mit Ameisen expandproperties Filter anstelle der ersetzen Aufgabe . Mit der Aufgabe ersetzen, neigt die Build-Datei zu wachsen meist tokenization zu sein. expandproperties können Sie ant Eigenschaften direkt in Ihren Text einzubetten.

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

Ich habe eine Lösung, die bei Bedarf für diese besondere Situation funktioniert. Ich habe den Ant ersetzen 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="@BRANDING@" value="ONE_BRAND"/>
  <replace file="./tme3/MyConst.java" token="@STYLESHEET@"
           value="../stylesheet/onebrand.css"/>
  <replace file="./tme3/MyConst.java" token="@FAVICON@" value="../images/onebrand.ico"/>
  <replace file="./tme3/MyConst.java" token="@SHOW_LANGUAGES@" value="false"/>
</target>

Ich mache nur Kopien dieser Blöcke und die Ersetzungen für die Fälle ändere Ich brauche - in meinem Fall gibt es drei Sätze jetzt, aber mehr erwartet

.

Durch ein und alles für die großen Antworten.

Mit Ant Eigenschaftsdateien und bauen mit „-Dbrand = X “.

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