我已經在Tomcat 6上部署了應用程序,並且在部署後,我想對常量類進行一些更改,並且僅將常量類(.class
文件)上載到爆炸的war文件。常量不會在Tomcat中的類替換後更改
甚至在我重新啓動服務器幾次後,我所做的更改不會顯示。
我改變的只是常量中的一些字符串。除了上傳戰爭文件之外,你會建議我做什麼?
我已經在Tomcat 6上部署了應用程序,並且在部署後,我想對常量類進行一些更改,並且僅將常量類(.class
文件)上載到爆炸的war文件。常量不會在Tomcat中的類替換後更改
甚至在我重新啓動服務器幾次後,我所做的更改不會顯示。
我改變的只是常量中的一些字符串。除了上傳戰爭文件之外,你會建議我做什麼?
您將不得不重新編譯所有引用那些String
常量的類。
注意,當他們在其他類中使用的原語類型或所用compile time constant value(所謂constant variable)初始化String
類型的static final
字段將被內聯。
換句話說,如果你有這些類:
public class Constants {
public static final int FOO = 42;
}
public class Bar {
public void frobnicate() {
System.out.println(Constants.FOO);
}
}
然後在編譯時的FOO
值將被編譯成.class
文件Bar
,這意味着Bar
不再在運行時引用Constants
!
這也意味着FOO
任何變化則要到上Bar
沒有影響你與新Constants.class
重新編譯Bar
。
此效果在JLS §13.4.9 final
Fields and Constants中詳細討論。
避免將來出現此問題的一種方法是確保編譯器不會將「常量」解釋爲常量變量。做到這一點的一種方法是通過靜態初始化塊將值從初始值賦值爲簡單賦值:
public class Constants {
public static final int FOO;
static {
FOO = 42;
}
}
非常感謝,就像你說的那樣。寶貴的答覆,我不會忘記這一點。 – sYl3r 2011-04-12 04:22:08
爲什麼再次上傳* .war *文件不是選項?正如Joachim Sauer指出的那樣,您需要使用常量重新編譯和重新部署每個* .class *文件。順便說一句,「常量」就像是比方說,PI。兩個部署之間PI的價值不大可能發生變化。這就是常數應該是的。可以改變的常量並不是真正的常量,應該使用另一種意思來存儲。例如,如果您有一些說*官方語言=「DE」*,然後可以更改爲「FR」,那麼通常在DB中存儲這樣一個「不是真正的常量」。 – SyntaxT3rr0r 2011-04-11 09:03:10
我實際上將我的戰爭文件上傳到生產服務器,所以我無法再上傳它(這需要我很長的時間)。由於拼寫錯誤,我不得不改變常數。幸運的是,我不得不上傳另外5個課程文件。 – sYl3r 2011-04-12 04:28:43