2012-10-08 23 views
1

我有一個項目MyProject,它在另一個項目BaseProject中具有對配置的依賴關係。在BaseProject內部我對許多不同的項目(如ErrorLogging,PerformanceLogging等)都有依賴關係......我希望能夠構建頂級項目(MyProject),並讓它過濾所有作爲依賴關係的項目中的所有spring xml文件。我沒有任何運氣。我可以看到這些豆,但他們沒有被過濾。一些bean正在使用在它們自己的poms中定義的默認過濾器進行過濾,但不使用MyProject中的過濾器。從依賴項目過濾Spring XML文件

MyProject - 這包含過濾器文件並從其他項目導入配置。

BaseProject - 定義了需要過濾的spring bean。

ErrorLogging - 定義了需要過濾的spring bean。

當我從MyProject運行一個包時,所有的spring文件都被正確地提取到jar文件中,但它們仍然包含屬性佔位符值$ {error.logging.host},例如... MyProject中的bean被正確過濾。另一種方法是在MyProject中定義bean,但其中大約有10個使用BaseProject的項目以及它的bean,我不想在10個獨立的項目中重新定義它們。

如果有人能夠解決這個問題,它會很棒。由於

編輯:

爲了使這更清楚,我有項目ErrorLogging稱爲錯誤-config.xml中定義連接到數據庫豆內部彈簧豆XML定義。這只是佔位符的連接細節,應該由MyProject中的filter.properties文件提供。

errors-config.xml作爲資源被導入baseproject-config.xml中,該base.xml位於BaseProject內。基本項目和它的配置文件被導入MyProject。

然後我使用Maven構建MyProject,我想將errors-config.xml中的屬性佔位符替換爲MyProject中filter.properties中的值。 MyProject可以成功地過濾它自己的文件,但不是那些ErrorsLogging項目。 ErrorsLogging似乎從它自己的src/main/resources文件夾中取出過濾器,而不是MyProject的過濾器。

+0

請您提供更多詳情。這是在BaseProject或ErrorLogging項目中定義的bean的示例,以及您如何嘗試在MyProject上下文中排除它們的示例。 –

+0

由於更簡單,我將編輯該文章 – DeliveryNinja

+0

看起來像'PropertiesPlaceHolderConfigurer'的工作,請參閱http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/xsd-config。 html#xsd-config-body-schemas-context-pphc – 2012-10-08 17:52:53

回答

1

可以實現通過拆包所有依賴,過濾和再包裝,整個過程取決於項目的結構,一個基本的配置這或許就足夠了:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>unpack-dependencies</id> 
      <!--unpack all the dependencies to the target of this project-->   
      <phase>initialize</phase> 
      <inherited>false</inherited> 
      <goals> 
       <goal>unpack-dependencies</goal> 
      </goals> 
      <configuration> 
       <includeGroupIds>${pom.groupId}</includeGroupIds> 
       <overWrite>true</overWrite> 
       <outputDirectory>${project.build.directory}/${artifactId}</outputDirectory> 
       <includes>**/*.properties,**/*.xml</includes> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <configuration> 
     <descriptors> 
      <descriptor>${config.maven.plattform.resources}/assembly/zip.xml</descriptor> 
     </descriptors> 
    </configuration> 
    <executions> 
     <execution> 
      <id>zip</id> 
      <phase>package</phase> 
      <inherited>true</inherited> 
      <goals> 
       <goal>assembly</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

這應該工作,只要因爲您已經正確定義了資源的正確過濾(稍後發生並且使用maven-resources-plugin)。

+0

謝謝,對於遲到的回覆感到抱歉,我會在一段時間後稍微查看一下。這看起來更像我正在尋找的東西。 – DeliveryNinja

1

您可以使用PropertyOverrideConfigurer覆蓋初始屬性。 例如,如果你在errors-config.xml如下因素的數據源定義:

<bean id="propertyOverideConfigurer" class="org.springframework.beans.factory.config.PropertyOverrideConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>filter.properties</value> 
     </list> 
    </property> 
</bean> 

而在filter.properties文件,你需要:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
    <property name="driverClass" value="${hibernate.driverClassName}" /> 
    <property name="jdbcUrl" value="${hibernate.url}" /> 
    <property name="user" value="${hibernate.username}" /> 
    <property name="password" value="${hibernate.password}" /> 
</bean> 

您可以在MyProject背景下這樣的覆蓋數據庫連接屬性指定你想覆蓋的豆的名稱和屬性:

datasource.driverClass = oracle.jdbc.driver.OracleDriver 
datasource.jdbcUrl = jdbc:oracle:thin:@localhost:1521:xe 
datasource.user = username 
datasource.password = password 

希望這個他LPS。

+0

@DeliveryNinja的過濾器值這對您有幫助嗎? –

+0

我不能在這裏回覆它太長哈哈。在堅果殼中,這沒有奏效。這只是指定一個filter.properties文件來使用,但是這個過濾在將Bean從ErrorLogging/BaseProject導入到MyProject之前發生,所以errors-config.xml只是使用它自己的filter.properties(在它的pom.xml中定義),而不是filter.properites MyProject。 – DeliveryNinja