2011-12-14 96 views
3

我和我的朋友正在創建一個程序並使用SVN來共享代碼。問題是我們在其中使用谷歌地圖,所以我們需要我們所有人擁有不同的API密鑰。現在我們已經在應用程序中註釋了我們的API密鑰的行,但是如果有人改變了這個類並且提交了他的API,這是令人討厭的。如何讓SVN忽略文件中的某些代碼行?

有沒有辦法告訴不要將某些代碼行提交給SVN?

+1

爲什麼你不共享一個API密鑰? –

+0

@Matjaz因爲谷歌需要不同地點的不同密鑰。 – ams

+1

您可以將cnofiguration移動到某個靜態java文件,或者更好地移動到資源包(.properties文件)和「svn忽略」它。 –

回答

5

從您的程序中刪除硬編碼,以便這些類是通用的(並且可以提交給SVN)。

而是將config/API密鑰存儲在外部配置文件或數據庫中。增強代碼以在應用程序啓動時從您存儲它的任何地方加載配置。


更新:

下面是創建和使用屬性文件一個非常簡單的代碼示例:http://www.bartbusschots.ie/blog/?p=360

+0

問題是如何讓SVN忽略某些行,而不是如果選擇的方法是正確的。 –

0

通常這樣的事情是不是源代碼版本控制工具的一部分。大多數開發人員使用構建系統來解決這個問題或類似的問題例如。行家。

與Maven例如某人具有不同的API密鑰或文件夾引用等

1

將定義與不同用戶的不同屬性文件不同的配置文件也許你可以將用戶文件的.properties,在這裏你可以存儲所有的API鍵,例如你可以調用一個屬性myAPIKey,其他可以被稱爲像APIKey1,APIKey 2.

如果你這樣做,你只需要改變你想使用的屬性的名稱myAPIKey並加載它在你的java類...

1

首先,配置不屬於碼。編寫一個.properties文件並在那裏存儲密鑰和其他屬性。

之後,你應該

1)提交屬性的副本文件(也許properties_svn)

2)使你的構建過程中,複製properties_svn到性能,如果後來沒有找到。

3)享受

1

這是不好的做法,在SVN存儲密鑰。這就像在你的信用卡上存儲密碼。 O可能在信用卡本身上寫保密碼。

這些密鑰應該位於私有環境的SVN之外。如果你不想創建這樣的文件實現傳遞鍵作爲參數或系統屬性的能力。

1

正確的答案是「不要這樣做」,正如其他人已經說過的那樣。

如果必須肯定這是更好地把所有你的各種按鍵在那裏,然後或者選擇在編譯時正確的(例如C預處理器),或在運行時(例如基於hostname)。

1

您應該在代碼外部持有這種類型的配置,通常在屬性文件中,在運行時注入所需的值。

我通常使用一系列的屬性文件中使用Spring的org.springframework.beans.factory.config.PropertyPlaceholderConfigurer每個允許的屬性值根據需要下降到一個特定的用戶進行覆蓋,從而產生以下配置:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> 
    <property name="ignoreUnresolvablePlaceholders" value="true"/> 
    <property name="ignoreResourceNotFound" value="true"/> 
    <property name="order" value="1"/> 
    <property name="locations"> 
    <list> 
     <value>classpath:my-system.properties</value> 
     <value>classpath:my-system-${HOST}.properties</value> 
     <value>classpath:my-system-${USERNAME}.properties</value> 
    </list> 
    </property> 
</bean> 

如果你不使用春天你可以達到這樣的代碼相同的效果:

Properties properties = new Properties(); 

InputStream systemPropertiesStream = ClassLoader.getSystemResourceAsStream("my-system.properties"); 
if (systemPropertiesStream != null) 
{ 
    try 
    { 
    properties.load(systemPropertiesStream); 
    } 
    finally 
    { 
    systemPropertiesStream.close(); 
    } 
} 

InputStream hostPropertiesStream = ClassLoader.getSystemResourceAsStream("my-system" + InetAddress.getLocalHost().getHostName() + ".properties"); 
if (hostPropertiesStream != null) 
{ 
    try 
    { 
    properties.load(hostPropertiesStream); 
    } 
    finally 
    { 
    hostPropertiesStream.close(); 
    } 
} 

InputStream userPropertiesStream = ClassLoader.getSystemResourceAsStream("my-system" + System.getProperty("user.name") + ".properties"); 
if (userPropertiesStream != null) 
{ 
    try 
    { 
    properties.load(userPropertiesStream); 
    } 
    finally 
    { 
    userPropertiesStream.close(); 
    } 
}