Môi trường biến với Maven


85

Tôi đã chuyển một dự án từ Eclipse sang Maven và tôi cần đặt một biến môi trường để dự án của mình hoạt động.

Trong Eclipse, tôi đi tới "Chạy -> Chạy cấu hình" và trong tab "môi trường", tôi đặt "WSNSHELL_HOME" thành giá trị "conf".

Làm thế nào tôi có thể làm điều này với Maven?

Cảm ơn rât nhiều!


Tôi muốn đề xuất để dự án của bạn chạy mà không có biến môi trường. Và sau đó chuyển sang maven.
khmarbaise

3
Không có lý do gì để bỏ qua việc sử dụng các biến môi trường nếu nó hữu ích cho hệ thống của bạn và tôi khá chắc chắn rằng giải pháp của tôi hoạt động (tôi tự sử dụng nó). Xem gợi ý của tôi từ chối 'System.getenv' / 'System.getProperty'.
FrVaBe

Câu trả lời:


120

Bạn chỉ có thể chuyển nó trên dòng lệnh, như

mvn -DmyVariable=someValue install

[Cập nhật] Lưu ý rằng thứ tự của các tham số là rất quan trọng - bạn cần chỉ định bất kỳ tùy chọn nào trước (các) lệnh. [/ Cập nhật]

Trong tệp POM, bạn có thể tham chiếu đến các biến hệ thống (được chỉ định trên dòng lệnh hoặc trong pom) dưới dạng ${myVariable}và các biến môi trường là ${env.myVariable}. (Cảm ơn những người bình luận đã chỉnh sửa.)

Cập nhật2

OK, vì vậy bạn muốn chuyển biến hệ thống của mình cho các thử nghiệm của mình. Nếu - như tôi giả định - bạn sử dụng plugin Surefire để thử nghiệm, thì tốt nhất là chỉ định (các) biến hệ thống cần thiết trong pom, trong pluginsphần của bạn , ví dụ:

<build>
    <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            ...
            <configuration>
                ...
                <systemPropertyVariables>
                    <WSNSHELL_HOME>conf</WSNSHELL_HOME>
                </systemPropertyVariables>
            </configuration>
        </plugin>
        ...
    </plugins>
</build>

Tôi cần khởi chạy 'mvn test', nó dường như không hoạt động, vì nếu tôi viết mvn test -DWSNSHELL_HOME = conf Tôi vẫn nhận được ngoại lệ java.io.FileNotFoundException: null / wsnshell.conf (Không có tệp hoặc thư mục như vậy)
Gianluca

2
@Janky, hãy thử theo cách khác mvn -DWSNSHELL_HOME=conf test.
Péter Török

nope ... :( Tôi vẫn nhận được java.io.FileNotFoundException: null / wsnshell.conf (Không có tệp hoặc thư mục như vậy) ... trong mã Tôi đọc biến theo cách này .. System.getenv("WSNSHELL_HOME");có đúng không?
Gianluca

@Janky, đợi một chút, bạn chạy ứng dụng trực tiếp từ bản dựng Maven hay ...?
Péter Török

43
Hai bạn đang nhầm lẫn giữa Biến môi trường với Thuộc tính hệ thống. Tùy chọn lệnh -D chỉ đặt Thuộc tính Hệ thống.
Wouter Lievens

25

Các -Dthuộc tính sẽ không đáng tin cậy được truyền từ trình cắm chắc chắn đến thử nghiệm của bạn (tôi không biết tại sao nó hoạt động với nhật thực). Khi sử dụng maven trên dòng lệnh, hãy sử dụng thuộc tính argLine để bọc thuộc tính của bạn. Điều này sẽ chuyển chúng đến bài kiểm tra của bạn

mvn -DargLine="-DWSNSHELL_HOME=conf" test

Sử dụng System.getPropertyđể đọc giá trị trong mã của bạn. Hãy xem bài đăng này về sự khác biệt của System.getenvSytem.getProperty.


2
Bạn nên đọc thuộc tính bằng System.getProperty ("WSNSHELL_HOME") thay vì sử dụng System.getenv.
FrVaBe

Hoàn hảo, sau khi dành rất nhiều thời gian để thử những thứ khác, cái này đã hiệu quả với tôi.
Bhushan

Nếu bạn đã định cấu hình các tham số argLine cho plugin surefire trong pom.xml của mình, thì hãy thêm ${argLine}trình giữ chỗ, nếu không, các tham số từ dòng lệnh sẽ không được chọn. Ví dụ:<argLine>-Duser.timezone=UTC ${argLine}</argLine>
sorrymissjackson

Điều này làm việc cho tôi, cảm ơn! Thật là một công cụ gọn gàng để định cấu hình hệ thống đạo cụ cho các bài kiểm tra maven. Vẫn là thoạt nhìn rất khó hiểu, tại sao không thể trực tiếp sử dụng chúng mà lại yêu cầu lập luận thêm.
phi

9

Bạn có thể gói lệnh maven của mình trong một tập lệnh bash:

#!/bin/bash

export YOUR_VAR=thevalue
mvn test
unset YOUR_VAR

Thật không thể tin được, đây là phương pháp duy nhất hoàn toàn hiệu quả với tôi bằng cách sử dụng plugin Surefire. Trong số 10 env vars mà tôi đặt trong POM, hai trong số chúng không được nhìn thấy khi chạy thử nghiệm. Ngay cả khi tôi đặt chúng vào shell và sau đó mvn install, chúng vẫn bị che khuất bằng cách nào đó. Tuy nhiên, nếu tôi chạy từ một tập lệnh shell, nó hoạt động tốt! Tôi ước tôi hiểu tại sao điều này xảy ra.
Pete

Tôi tin rằng đây phải là một câu trả lời được chấp nhận vì đây là giải pháp đơn giản nhất
wtsiamruk

5

Đối với biến môi trường trong Maven, bạn có thể đặt bên dưới.

http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#enosystemVariables http://maven.apache.org/surefire/maven-failsafe-plugin/integration-test-mojo.html #enosystemVariables

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    ...
    <configuration>
        <includes>
            ...
        </includes>
        <environmentVariables>
            <WSNSHELL_HOME>conf</WSNSHELL_HOME>
        </environmentVariables>
    </configuration>
</plugin>

4

Có một plugin maven có tên là thuộc tính-maven-plugin này cung cấp một mục tiêu set-system-propertiesđể đặt các biến hệ thống. Điều này đặc biệt hữu ích nếu bạn có một tệp chứa tất cả các thuộc tính này. Vì vậy, bạn có thể đọc một tệp thuộc tính và đặt chúng làm biến hệ thống.



1

trong mã của bạn thêm:

System.getProperty("WSNSHELL_HOME")

Sửa đổi hoặc thêm thuộc tính giá trị từ lệnh maven:

mvn clean test -DargLine=-DWSNSHELL_HOME=yourvalue

Nếu bạn muốn chạy nó trong Eclipse, hãy thêm các đối số VM trong cấu hình Gỡ lỗi / Chạy của bạn

  • Đi tới Chạy -> Chạy cấu hình
  • Chọn đối số tab
  • Thêm vào phần Đối số VM

-DWSNSHELL_HOME = giá trị của bạn

Xem ví dụ hình ảnh

bạn không cần phải sửa đổi POM


0

Theo tài liệu từ câu trả lời của @ Kevin, tài liệu dưới đây phù hợp với tôi để thiết lập biến môi trường với plugin maven sure-fire

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
    <environmentVariables>
        <WSNSHELL_HOME>conf</WSNSHELL_HOME>
    </environmentVariables>
</configuration>

0

Bạn có thể chuyển một số đối số thông qua _JAVA_OPTIONSbiến.

Ví dụ: xác định một biến cho các cờ proxy maven như sau:

_JAVA_OPTIONS="-Dhttp.proxyHost=$http_proxy_host -Dhttp.proxyPort=$http_proxy_port -Dhttps.proxyHost=$https_proxy_host -Dhttps.proxyPort=$http_proxy_port"

Và sau đó sử dụng mvn clean install(nó sẽ tự động nhận _JAVA_OPTIONS).

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.