Làm cách nào để tham chiếu biến môi trường trong POM.xml?


172

Tôi đang sử dụng maven làm công cụ xây dựng. Tôi đã thiết lập một biến môi trường được gọi là env. Làm cách nào tôi có thể truy cập vào giá trị của biến môi trường này trong pom.xmltệp?


7
bạn có thể giới thiệu nó với $ {env.XXXXXXXX} trong đó XXXXXXXX là tên biến của bạn. Ví dụ: $ {env.PATH} sẽ cung cấp tham chiếu PATH.
Seshagiri

2
Nhưng có lẽ bạn không nên. Nếu bạn tạo các bản dựng của mình phụ thuộc vào môi trường của bạn, chúng sẽ khó tái tạo hơn.
Stephen C

5
@StephenC Tôi sẽ không nói "không nên", nhưng "hãy cẩn thận." Đôi khi một môi trường CI và môi trường dev cục bộ trông khác nhau và các biến môi trường là một cách để lấp đầy các khoảng trống.
Andrew White

1
Đối với tôi, IntelliJ 2019 hiển thị ${env.XYZ}tham chiếu là màu đỏ. Biến được mở rộng chính xác trong thời gian chạy nhưng hiển thị màu đỏ ở thời gian biên dịch. Do đó, tôi có cùng một câu hỏi đã được hỏi ban đầu.
djangofan

1
Vâng, nó @MarkHan
djangofan

Câu trả lời:


216

Kiểm tra Hướng dẫn thuộc tính Maven ...

Như Seshagiri đã chỉ ra trong các ý kiến, ${env.VARIABLE_NAME}sẽ làm những gì bạn muốn.

Tôi sẽ thêm một từ cảnh báo và nói rằng pom.xmlnên mô tả hoàn toàn dự án của bạn vì vậy hãy sử dụng các biến môi trường một cách thận trọng. Nếu bạn tạo các bản dựng của mình phụ thuộc vào môi trường của bạn, chúng sẽ khó tái tạo hơn


3
Ngoài ra, nó làm cho nền tảng xây dựng của bạn và phụ thuộc vào hệ thống.
lhunath

12
Hãy thận trọng: tất cả các ký tự của biến_name trong pom của bạn phải là chữ hoa để độc lập với nền tảng. Bởi vì nó chỉ hợp lệ ở dạng chữ hoa chạy trên HĐH Windows. Ví dụ: $ {env.M2_HOME} là hợp lệ, $ {env.m2_home} không hợp lệ, ngay cả khi bạn đã xác định một biến môi trường có tên m2_home.
Jeff Liu

Tôi có tính năng này trong các thuộc tính Môi trường Windows (WL_HOME = c: \ apps \ Weblogic12 \ wlserver_12.1) nhưng trong pom, nó trả về giá trị này c: \ apps \ Weblogic12 \ wlserver (without_12.1) bất kỳ ý tưởng nào mà maven có thể chọn cái này lên từ đâu?
Anand Rockzz

Chỉ cần nhận ra rằng tôi đã xác định đúng <wl_home> $ {WL_HOME} </ wl_home> và sử dụng nó và bằng cách nào đó, nó được gọi mà không có phiên bản nếu tôi làm điều đó.
Anand Rockzz

Nó hoạt động tốt trong Windows cho IDE & CLI. Đối với MacOS / Linux / Unix , một chút khó khăn để nhận được hỗ trợ từ IDE mà không nghi ngờ gì về Terminal , nó hoạt động tốt.
Md Shahed Hossain

29

Có thể an toàn hơn khi truyền trực tiếp các biến môi trường vào các thuộc tính hệ thống maven. Ví dụ: giả sử trên Linux, bạn muốn truy cập biến môi trường MY_VARIABLE. Bạn có thể sử dụng một thuộc tính hệ thống trong tệp pom của bạn.

<properties>
    ...
    <!-- Default value for my.variable can be defined here -->
    <my.variable>foo</my.variable>
    ...
</properties>
...
<!-- Use my.variable -->
... ${my.variable} ...

Đặt giá trị thuộc tính trên dòng lệnh maven:

mvn clean package -Dmy.variable=$MY_VARIABLE

4
Tại sao điều này an toàn hơn?
weberjn

Điều này không hiệu quả với tôi, giá trị mới của my.variable được cung cấp trên dòng lệnh không bao giờ ghi đè giá trị trong khối <property>. Có ý kiến ​​gì không?
Daniel Scott

Đối với tôi an toàn hơn, hoặc ít nhất là ít bí ẩn hơn, các thuộc tính b / c có thể được mô tả trong tệp thuộc tính. Tuy nhiên, tôi nhận ra giải pháp của mình dựa vào khung Spring, có lẽ đó là lý do tại sao nó không hiệu quả với Daniel.
EricGreg

Sẽ an toàn hơn vì nếu bạn không thay đổi giá trị thông qua dòng lệnh / môi trường, thì đó vẫn là POM hợp lệ và bản dựng, từ giá trị trong thuộc tính.
foo

20

Ngoài ra, hãy đảm bảo rằng biến môi trường của bạn chỉ được tạo bởi LỚP TRƯỜNG HỢP .... Tôi không biết tại sao (tài liệu không nói gì về nó, ít nhất là liên kết được cung cấp bởi @Andrew White), nhưng nếu biến là một từ viết thường (ví dụ env.dummy), biến luôn luôn trống hoặc null ...

Tôi đã vật lộn với điều này như một giờ, cho đến khi tôi quyết định thử một BIỂU TƯỢNG LỚN, và vấn đề đã được giải quyết.

Các ví dụ biến OK:

  • Con gái
  • DUMMY_ONE
  • JBOSS_SERVER_PATH

( LƯU Ý : Tôi đã sử dụng maven v3.0.5)

Tôi hy vọng rằng điều này có thể giúp ai đó ....


5
Các biến môi trường trong unix rất phân biệt chữ hoa chữ thường và được đặt theo tên chữ hoa theo cách truyền thống để khi bạn nhìn vào các biến được đặt trong trình bao của mình, bạn có thể dễ dàng phân biệt được đặt cục bộ vào vỏ của bạn và hiển thị cho các tiến trình con. Các biến môi trường trong Windows dường như không phân biệt chữ hoa chữ thường, nhưng tôi chưa xác minh rằng từ tài liệu, chỉ từ một thử nghiệm nhỏ tại dấu nhắc lệnh.
hợp pháp hóa

11

Chúng ta không thể sử dụng

<properties>
    <my.variable>${env.MY_VARIABLE}</my.variable>
</properties>

Nó ẩn, trái ngược với khi bạn vượt qua nó bằng -D làm cho nó rõ ràng và ghi đè giá trị thuộc tính mặc định, có thể vẫn hữu ích để thiết lập môi trường cấu hình bằng không (ví dụ: dev)
Technoshaft

1
Nó có hoạt động không? Tôi đã thử nó và ít nhất là không phải trong môi trường của tôi
user26270

3

Tôi đã vật lộn với điều tương tự, chạy một kịch bản shell đặt các biến, sau đó muốn sử dụng các biến trong shared-pom. Mục tiêu là để các biến môi trường thay thế các chuỗi trong các tệp dự án của tôi bằng cách sử dụng plugin com.google.code.maven-replacer-plugin.

Sử dụng ${env.foo}hoặc ${env.FOO}không làm việc cho tôi. Maven không tìm thấy biến. Những gì đã làm việc là truyền biến trong một tham số dòng lệnh trong Maven. Đây là thiết lập:

  1. Đặt biến trong tập lệnh shell. Nếu bạn khởi chạy Maven trong tập lệnh phụ, hãy đảm bảo rằng biến đang được đặt, ví dụ: sử dụng source ./maven_script.shđể gọi nó từ tập lệnh gốc.

  2. Trong shared-pom, tạo một tham số dòng lệnh lấy biến môi trường:

<plugin>
  ...
  <hành quyết>
    <hành quyết>
    ...
      <thực thi>
      ...
        <cấu hình>
          <param> $ {foo} </ param> <! - Lưu ý đây là * không * $ {env.foo} ->
        </ cấu hình>
  1. Trong com.google.code.maven-replacer-plugin, tạo giá trị thay thế ${foo}.

  2. Trong kịch bản shell của tôi gọi maven, hãy thêm nó vào lệnh: -Dfoo=$foo


0

Bạn có thể sử dụng <properties>thẻ để xác định một biến và ${variable}mẫu tùy chỉnh để sử dụng nó

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <!-- define -->
    <properties>
        <property.name>1.0</property.name>
    </properties>

    <!-- using -->
    <version>${property.name}</version>

</project>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.