سؤال

لقد ورثت تطبيق Java (servlets) الذي يعمل تحت Tomcat. لأسباب تاريخية ، يحتوي الكود على خيارات مختلفة "Look and Feel" بناءً على المكان الذي سيتم فيه نشر التطبيق (في الأساس مسألة علامة تجارية).

هناك العديد من الثوابت التي تتحكم في عملية العلامة التجارية هذه ، والتي لها وظائف مختلفة ويجب عدم ضغطها في ثابت واحد (أي العلامة التجارية ، متعددة اللغات ، بالإضافة إلى مواقع الرموز وأوراق نمط CSS ، إلخ).

يجب على فريق التطوير حاليًا تغيير الثوابت يدويًا (يتم توطينها على الأقل في فئة بيانات واحدة وموثقة جيدًا) ، ثم إعادة ترجمة التطبيق باستخدام ANT.

ما هي أفضل طريقة لأتمتة هذه العملية بافتراض على الأقل Ant 1.8 و Java 6.x؟

أعلم أنه لم يكن هناك أي حلول جيدة باستخدام وسيطات برمجيات البرمجيات (مثلما يمكن للمرء أن يفعله في C أو C ++) ، وأنا أميل إلى "أفضل طريقة" لتحرير الملف المصدر الذي يحتوي على الثوابت ، أو وضعها في ملف آخر و تبديلها باستخدام عملية بناء النمل. أرغب في الحصول على نتيجة من شأنها أن تعمل باستخدام شيء مثل "Ant Build Brand-X" حيث سيغير تغيير العلامة التجارية البناء الناتج.

شكرًا،

-Richard

هل كانت مفيدة؟

المحلول

استخدم مهمة استبدال في ANT لتغيير القيم.

نصائح أخرى

ضع قيمك في ملف الخصائص ، قل "myapp.properties" ثم قم بتحميلها في ثوابتك من ClassPath عند بدء التشغيل (انظر أدناه لمعرفة كيفية تناسب هذا في عملية الإنشاء):

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

الآن ، لديك ملف خصائص منفصل لكل علامة تجارية. تمرير اسمه إلى ANT عبر -D أو Build.properties ونسخ الملف إلى دليل البناء مباشرة قبل أن تقوم بالجرار (أو الحرب).

من الواضح أن الكود أعلاه ستعمل ، ولكن هناك العديد من الطرق التي يمكنك من خلالها تنظيفها وجعلها دليلًا على الرصاص.

هناك أيضًا طريقة "الربيع" ، وهي استخدام ملف خصائص ، وفول يسحب القيمة من الخصائص ويحققها في الفئات التي تحتاج إليها ، على سبيل المثال:

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

وبعد ذلك ، يمكنك حقن الخصائص باستخدام بناء جملة "مثل النمل":

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

والتي من المحتمل أن تستلزم إعادة الكتابة أكثر مما تريد. إذا كنت ستغير الثوابت في كل مجموعة ، فسأرتبه من هذا gotcha (إذا كنت تستخدم نهائيات ثابتة ، وهذا هو).

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

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

إذا قمت بعد ذلك بتغيير some_constant في foo إلى 2 ولكن لا تقم بإعادة ترجمة شريط ، فسوف يحتفظ Bar بقيمة 1 لـ Some_constant ، حيث يتم تجميع النهائيات الثابتة (نظرًا لأن المترجم يرى أنه يجب ألا يحتاج إلى اكتشافها مرة أخرى على الإطلاق ).

أفضل استخدام النمل exproperties تصفية بدلا من المهمة استبدال. مع مهمة استبدال ، يميل ملف الإنشاء إلى النمو ليكون في الغالب رمزية. يتيح لك ExplostProperties تضمين خصائص ANT مباشرة في النص الخاص بك.

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

لدي حل يعمل حسب الحاجة لهذا الموقف بالذات. لقد استخدمت مهمة استبدال ANT بالتزامن مع إصدار "متحفظ" من الفئة الثابتة:

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

أنا فقط أقوم بعمل نسخ من هذه الكتلة وأغير بدائل الحالات التي أحتاجها - في حالتي الخاصة ، هناك 3 مجموعات الآن ، ولكن متوقعًا.

شكرا واحد وجميع على الردود العظيمة.

استخدام النمل ملفات الخصائص, ، وبناء مع "-dbrand = x".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top