2012-05-24 36 views
7

Tôi có một tệp Maven settings.xml trong thư mục ~/.m2 của mình; nó trông như thế này:Sử dụng thuộc tính settings.xml của Maven bên trong bối cảnh Spring

<settings> 
    <profiles> 
     <profile> 
      <id>mike</id> 
      <properties> 
       <db.driver>org.postgresql.Driver</db.driver> 
       <db.type>postgresql</db.type> 
       <db.host>localhost</db.host> 
       <db.port>5432</db.port> 
       <db.url>jdbc:${db.type}://${db.host}:${db.port}/dbname</db.url> 
      </properties> 
     </profile> 
    </profiles> 
    <activeProfiles> 
     <activeProfile>mike</activeProfile> 
    </activeProfiles> 
    <servers> 
     <server> 
      <id>server_id</id> 
      <username>mike</username> 
      <password>{some_encrypted_password}</password> 
     </server> 
    </servers> 
</settings> 

tôi muốn sử dụng những tính chất hai lần

  • Khi bên trong giai đoạn integration-test Maven để thiết lập và phá đổ cơ sở dữ liệu của tôi. Sử dụng tính năng lọc Maven, tính năng này hoạt động hoàn hảo.
  • Lần thứ hai khi chạy ứng dụng Spring của tôi, có nghĩa là tôi cần phải thay thế các thuộc tính này vào tệp servlet-context.xml của mình trong giai đoạn resources:resources của Maven. Đối với các thuộc tính ở phần trên của settings.xml, chẳng hạn như ${db.url}, tính năng này hoạt động tốt. Tôi không thể tìm ra cách thay thế tên người dùng cơ sở dữ liệu và mật khẩu (đã được giải mã) của mình thành tệp Spring servlet-context.xml.

Phần thích hợp của tập tin servlet-context.xml của tôi trông giống như:

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName"><value>${db.driver}</value></property> 
    <property name="url"><value>${db.url}</value></property> 
    <property name="username"><value>${username}</value></property> 
    <property name="password"><value>${password}</value></property> 
</bean> 

Mục tiêu cuối cùng ở đây là dành cho mỗi nhà phát triển để có các cài đặt Maven riêng của họ (và cơ sở dữ liệu trên máy tính của mình để thử nghiệm hội nhập). ..Và thiết lập tương tự trên máy chủ Jenkins. Chúng tôi không muốn chia sẻ tên người dùng/mật khẩu phổ biến/v.v.

Trả lời

2

Có một cách để lọc tài nguyên web theo cấu hình của Maven War Plugin. Hãy xem this để biết đoạn trích từ tài liệu của plugin chính thức.

Và bằng cách này, tôi khuyên bạn nên xem xét lại cách lọc dựa trên này để cung cấp cấu hình thời gian chạy trên thực tế tại thời gian xây dựng. Chỉ cần thông báo rằng bạn phải xây dựng lại cùng một mã để chuẩn bị gói cho môi trường khác (hoặc cách khác là chỉnh sửa nội dung gói). Bạn có thể sử dụng các công cụ cụ thể của máy chủ ứng dụng cho điều này (ít nhất JBoss có một) hoặc sử dụng Spring mà AFAIR cũng có thể được cấu hình như thế này.

+0

Điểm đó về biên dịch lại hợp lệ. Tôi chắc chắn sẽ phải nhìn vào đó nhiều hơn, vì đó là một mô hình chống mà tôi hy vọng sẽ tránh được. Chắc chắn cần điều này để chạy theo kiểu CI/CD. Nhưng đồng thời, tôi đang cố gắng tái sử dụng thông tin đã tồn tại và được lưu trữ trong 'cài đặt.xml' – Mike

+0

OK, nó thực sự tốt, bạn sẽ refactor này. Hiện tại, như tôi đã nói, hãy sử dụng tính năng lọc tài nguyên web này. Nó sẽ hoạt động và cho phép bạn có cấu hình này ở một nơi, như bạn đã nói. –

+0

Mùa xuân 3.1 đã giới thiệu một loạt nội dung mới cho loại kịch bản chính xác này: http://blog.springsource.org/2011/02/15/spring-3-1-m1-unified-property-management/ – artbristol

1

Tôi khuyên bạn nên sử dụng tệp thuộc tính ở giữa. Ý tôi là: ứng dụng Spring sẽ tải các giá trị thuộc tính tạo thành tập tin thuộc tính bằng cách sử dụng context:property-placeholder và Maven sẽ là người thay thế các biến $ {...} bằng cách sử dụng các giá trị từ settings.xml bằng cách sử dụng tính năng lọc.

tập tin bất động sản của bạn:

db.driver=${db.driver} 
db.url=${db.url} 
username=${username} 
password=${password} 

bạn servlet-context.xml tập tin

<context:property-placeholder location="classpath:your-property-file.properties" /> 

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName"><value>${db.driver}</value></property> 
    <property name="url"><value>${db.url}</value></property> 
    <property name="username"><value>${username}</value></property> 
    <property name="password"><value>${password}</value></property> 
</bean> 

Trong pom.xml của bạn

<resources> 
    ... 
    <resource> 
     <directory>src/main/resources</directory> 
     <filtering>true</filtering> 
    </resource> 
    ... 
</resources> 
0

Tôi đã không thử nó, nhưng theo maven wiki page này, bạn có thể tham khảo các thuộc tính trong settings.xml sử dụngTiền tố. Vì vậy, ${settings.servers.server.username} lý tưởng nên trả lại username trong settings.xml.

+0

Đó là trong phạm vi của Maven, không phải của Spring, vì vậy bạn không thể truy cập vào những lúc đang chạy, trong Spring. Bạn chỉ có thể sử dụng chúng với tùy chọn bộ lọc. –

Các vấn đề liên quan