ตัวแปรสภาพแวดล้อมด้วย Maven


87

ฉันได้ย้ายโปรเจ็กต์จาก Eclipse ไปยัง Maven และฉันจำเป็นต้องตั้งค่าตัวแปรสภาพแวดล้อมเพื่อให้โปรเจ็กต์ของฉันทำงานได้

ใน Eclipse ฉันไปที่ "Run -> Run configuration" และภายใต้แท็บ "environment" ฉันตั้งค่า "WSNSHELL_HOME" เป็นค่า "conf"

ฉันจะทำสิ่งนี้กับ Maven ได้อย่างไร?

ขอบคุณมาก!


ฉันขอแนะนำให้ดำเนินโครงการของคุณโดยไม่มีตัวแปรสภาพแวดล้อม แล้วย้ายไปที่ maven
khmarbaise

3
ไม่มีเหตุผลที่จะข้ามการใช้ตัวแปรสภาพแวดล้อมหากมันมีประโยชน์สำหรับระบบของคุณและฉันค่อนข้างแน่ใจว่าโซลูชันของฉันใช้งานได้ (ฉันใช้เอง) ดูคำแนะนำของฉัน refarding 'System.getenv' / 'System.getProperty'
FrVaBe

คำตอบ:


124

คุณสามารถส่งผ่านไปยังบรรทัดคำสั่งเช่น

mvn -DmyVariable=someValue install

[อัปเดต]โปรดทราบว่าลำดับของพารามิเตอร์มีความสำคัญ - คุณต้องระบุตัวเลือกใด ๆก่อนคำสั่ง [/ ปรับปรุง]

ภายในไฟล์ POM คุณอาจอ้างถึงตัวแปรระบบ (ระบุในบรรทัดคำสั่งหรือใน pom) เป็น${myVariable}และตัวแปรสภาพแวดล้อมเป็น${env.myVariable}. (ขอบคุณผู้แสดงความคิดเห็นสำหรับการแก้ไข)

อัปเดต 2

ตกลงดังนั้นคุณต้องการส่งตัวแปรระบบไปยังการทดสอบของคุณ ถ้า - ตามที่ฉันคิด - คุณใช้ปลั๊กอิน Surefireสำหรับการทดสอบสิ่งที่ดีที่สุดคือการระบุตัวแปรระบบที่จำเป็นภายใน pom ในpluginsส่วนของคุณเช่น

<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>

ฉันต้องเปิด 'mvn test' ดูเหมือนว่าจะไม่ทำงานทำให้ถ้าฉันเขียน mvn test -DWSNSHELL_HOME = conf ฉันยังคงได้รับข้อยกเว้น java.io.FileNotFoundException: null / wsnshell.conf (ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว)
Gianluca

3
@Janky ลองวิธีอื่น ๆ เช่นmvn -DWSNSHELL_HOME=conf test.
PéterTörök

ไม่ ... :( ฉันยังได้รับ java.io.FileNotFoundException: null / wsnshell.conf (ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว) ... ในโค้ดฉันอ่านตัวแปรด้วยวิธีนี้ .. System.getenv("WSNSHELL_HOME");ถูกต้องหรือไม่
Gianluca

@Janky เดี๋ยวก่อนคุณเรียกใช้แอพโดยตรงจาก Maven build หรือ ... ?
PéterTörök

47
คุณทั้งสองกำลังสับสนตัวแปรสภาพแวดล้อมกับคุณสมบัติของระบบ อ็อพชันคำสั่ง -D ตั้งค่าคุณสมบัติของระบบเท่านั้น
Wouter Lievens

26

-Dคุณสมบัติจะไม่ได้รับความน่าเชื่อถือจากการขยายพันธุ์ที่ surefire-pluging การทดสอบของคุณ (ผมไม่ทราบว่าทำไมมันทำงานร่วมกับคราส) เมื่อใช้ maven บนบรรทัดรับคำสั่งให้ใช้คุณสมบัติargLineเพื่อรวมคุณสมบัติของคุณ สิ่งนี้จะผ่านการทดสอบของคุณ

mvn -DargLine="-DWSNSHELL_HOME=conf" test

ใช้System.getPropertyเพื่ออ่านค่าในรหัสของคุณ ดูโพสต์นี้เกี่ยวกับความแตกต่างของSystem.getenvและSytem.getProperty.


2
คุณควรอ่านคุณสมบัติด้วย System.getProperty ("WSNSHELL_HOME") แทนการใช้ System.getenv
FrVaBe

สมบูรณ์แบบหลังจากใช้เวลามากมายในการลองสิ่งอื่นสิ่งนี้ได้ผลสำหรับฉัน
Bhushan

หากคุณได้กำหนดค่าพารามิเตอร์ argLine สำหรับปลั๊กอิน surefire ใน pom.xml ของคุณให้เพิ่ม${argLine}ตัวยึดมิฉะนั้นพารามิเตอร์จากบรรทัดคำสั่งจะไม่ถูกหยิบขึ้นมา ตัวอย่าง:<argLine>-Duser.timezone=UTC ${argLine}</argLine>
sorrymissjackson

สิ่งนี้ได้ผลสำหรับฉันขอบคุณ! ช่างเป็นเครื่องมือที่ประณีตในการกำหนดค่าระบบอุปกรณ์สำหรับการทดสอบ maven เมื่อมองแวบแรกมันสับสนมากทำไมมันไม่สามารถใช้โดยตรง แต่ต้องมีการโต้แย้งเพิ่มเติม
phi

10

คุณสามารถตัดคำสั่ง maven ของคุณใน bash script:

#!/bin/bash

export YOUR_VAR=thevalue
mvn test
unset YOUR_VAR

ไม่น่าเชื่อนี่เป็นวิธีเดียวที่ใช้ได้ผลกับฉันโดยใช้ปลั๊กอิน Surefire จาก 10 env vars ที่ฉันตั้งไว้ใน POM สองตัวนี้จะไม่เห็นเมื่อทำการทดสอบ แม้ว่าฉันจะวางไว้ในเปลือกหอยแล้วmvn installก็ยังคงถูกบดบัง อย่างไรก็ตามหากฉันเรียกใช้จากเชลล์สคริปต์มันก็ใช้ได้ดี! ฉันหวังว่าฉันจะเข้าใจว่าทำไมสิ่งนี้จึงเกิดขึ้น
Pete

ฉันเชื่อว่านี่น่าจะเป็นคำตอบที่ได้รับการยอมรับเนื่องจากนี่เป็นทางออกที่ง่ายที่สุด
wtsiamruk

5

สำหรับตัวแปรสภาพแวดล้อมใน Maven คุณสามารถตั้งค่าด้านล่าง

http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#environmentVariables http://maven.apache.org/surefire/maven-failsafe-plugin/integration-test-mojo.html #environment ตัวแปร

<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

มีปลั๊กอิน maven ที่เรียกว่าproperties-maven-plugin ตัวนี้มีเป้าหมายset-system-propertiesในการตั้งค่าตัวแปรระบบ สิ่งนี้มีประโยชน์อย่างยิ่งหากคุณมีไฟล์ที่มีคุณสมบัติเหล่านี้ทั้งหมด คุณจึงสามารถอ่านไฟล์คุณสมบัติและตั้งเป็นตัวแปรระบบได้


3

อีกวิธีหนึ่งคือการตั้งค่าMAVEN_OPTS(หรือตัวแปรสภาพแวดล้อมอื่น ๆ ) ใน${user.home}/.mavenrc(หรือ%HOME%\mavenrc_pre.batบน windows)

เนื่องจาก Maven 3.3.1 มีความเป็นไปได้ใหม่ในการตั้งค่าพารามิเตอร์บรรทัดคำสั่ง mvnหากนี่คือสิ่งที่คุณต้องการจริง:

  • ${maven.projectBasedir}/.mvn/maven.config
  • ${maven.projectBasedir}/.mvn/jvm.config

1

ในรหัสของคุณเพิ่ม:

System.getProperty("WSNSHELL_HOME")

แก้ไขหรือเพิ่มคุณสมบัติค่าจากคำสั่ง maven:

mvn clean test -DargLine=-DWSNSHELL_HOME=yourvalue

หากคุณต้องการเรียกใช้ใน Eclipse ให้เพิ่มอาร์กิวเมนต์ VM ในการกำหนดค่าการดีบัก / รันของคุณ

  • ไปที่เรียกใช้ -> เรียกใช้การกำหนดค่า
  • เลือก Tab Arguments
  • เพิ่มในส่วน VM Arguments

-DWSNSHELL_HOME = ค่าของคุณ

ดูตัวอย่างภาพ

คุณไม่จำเป็นต้องแก้ไข POM


1

เอกสารดังต่อไปนี้จากคำตอบของ @ Kevin เอกสารด้านล่างนี้ใช้ได้กับฉันสำหรับการตั้งค่าตัวแปรสภาพแวดล้อมด้วยปลั๊กอิน 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

คุณสามารถส่งผ่านข้อโต้แย้งบางส่วนผ่านไฟล์ _JAVA_OPTIONSตัวแปรได้

ตัวอย่างเช่นกำหนดตัวแปรสำหรับแฟล็ก maven proxy ดังนี้:

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

แล้วใช้mvn clean install(มันจะรับโดยอัตโนมัติ_JAVA_OPTIONS)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.