จะอ้างอิงตัวแปรสภาพแวดล้อมใน POM.xml อย่างไร


172

ฉันใช้ maven เป็นเครื่องมือสร้าง envฉันได้ตั้งตัวแปรสภาพแวดล้อมที่เรียกว่า ฉันจะเข้าถึงค่าของตัวแปรสภาพแวดล้อมนี้ในpom.xmlไฟล์ได้อย่างไร?


7
คุณสามารถอ้างอิงได้ด้วย $ {env.XXXXXXXX} โดยที่ XXXXXXXXX เป็นชื่อตัวแปรของคุณ ตัวอย่างเช่น $ {env.PATH} จะให้การอ้างอิงเส้นทาง
Seshagiri

2
แต่คุณอาจไม่ควร หากคุณทำให้งานสร้างของคุณขึ้นอยู่กับสภาพแวดล้อมของคุณสิ่งเหล่านี้จะยากต่อการทำซ้ำ
สตีเฟ่นซี

5
@ สตีเฟนซีฉันจะไม่พูดว่า "ไม่ควร" แต่ "ระวังให้ดี" บางครั้งสภาพแวดล้อม CI และสภาพแวดล้อม dev ท้องถิ่นนั้นแตกต่างกันและตัวแปรสภาพแวดล้อมเป็นวิธีเติมช่องว่าง
Andrew White

1
สำหรับฉัน IntelliJ 2019 แสดงการ${env.XYZ}อ้างอิงเป็นสีแดง ตัวแปรถูกขยายอย่างถูกต้องที่รันไทม์ แต่แสดงเป็นสีแดง ณ เวลารวบรวม ฉันจึงมีคำถามแบบเดียวกันกับที่เคยถาม
djangofan

1
อ๋อใช่ @MarkHan
djangofan

คำตอบ:


216

ลองดูคู่มือคุณสมบัติ Maven ...

ดังที่ Seshagiri ชี้ให้เห็นในความคิดเห็น${env.VARIABLE_NAME}จะทำในสิ่งที่คุณต้องการ

ฉันจะเพิ่มคำเตือนและบอกว่า a pom.xmlควรอธิบายโครงการของคุณอย่างสมบูรณ์ดังนั้นโปรดใช้ตัวแปรสภาพแวดล้อมอย่างรอบคอบ หากคุณทำให้งานสร้างของคุณขึ้นอยู่กับสภาพแวดล้อมของคุณสิ่งเหล่านี้จะยากต่อการทำซ้ำ


3
นอกจากนี้ยังทำให้บิวด์แพลตฟอร์มของคุณและขึ้นอยู่กับระบบ
lhunath

12
ข้อควรระวัง: อักขระทั้งหมดของ variable_name ใน pom ของคุณจะต้องเป็นตัวพิมพ์ใหญ่เพื่อเป็นแพลตฟอร์มที่เป็นอิสระ เพราะมันใช้ได้ในรูปแบบตัวพิมพ์ใหญ่เท่านั้นที่ทำงานบน Windows OS ตัวอย่างเช่น $ {env.M2_HOME} นั้นถูกต้อง $ {env.m2_home} นั้นไม่ถูกต้องแม้ว่าคุณจะกำหนดตัวแปรสภาพแวดล้อมชื่อ m2_home
Jeff Liu

ฉันมีสิ่งนี้ในคุณสมบัติ Windows Environment (WL_HOME = c: \ apps \ Weblogic12 \ wlserver_12.1) แต่ใน pom มันส่งคืนค่านี้ c: \ apps \ Weblogic12 \ wlserver (ไม่มี _12.1) ความคิดใด ๆ มาจากไหน
Anand Rockzz

เพิ่งรู้ว่าฉันกำลังกำหนด <wl_home> $ {WL_HOME} </wl_home> อย่างถูกต้องและใช้สิ่งนั้นและมันก็เรียกว่าไม่มีเวอร์ชั่นถ้าฉันทำอย่างนั้น
Anand Rockzz

มันทำงานได้ดีในWindowsสำหรับ IDE & CLI สำหรับMacOS / Linux / Unixมันค่อนข้างยุ่งยากสำหรับการรับการสนับสนุนจาก IDE ที่ไม่ต้องสงสัยเลยว่าTerminalนั้นทำงานได้ดี
Md Shahed Hossain

29

มันอาจปลอดภัยกว่าที่จะส่งผ่านตัวแปรสภาวะแวดล้อมโดยตรงไปยังคุณสมบัติระบบ maven ตัวอย่างเช่นพูดบน Linux ที่คุณต้องการเข้าถึงตัวแปรสภาพแวดล้อม MY_VARIABLE คุณสามารถใช้คุณสมบัติของระบบในไฟล์ pom ของคุณ

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

ตั้งค่าคุณสมบัติบนบรรทัดคำสั่ง maven:

mvn clean package -Dmy.variable=$MY_VARIABLE

4
ทำไมจึงปลอดภัยกว่านี้?
weberjn

สิ่งนี้ไม่ทำงานสำหรับฉันค่าใหม่ของ my.variable ที่มีให้ในบรรทัดคำสั่งจะไม่แทนที่ค่าในบล็อก <properties> ความคิดใด ๆ
Daniel Scott

สำหรับฉันปลอดภัยกว่าหรืออย่างน้อยก็ลึกลับน้อยคุณสมบัติ b / c สามารถอธิบายได้ในไฟล์คุณสมบัติ อย่างไรก็ตามฉันรู้ว่าวิธีแก้ปัญหาของฉันนั้นขึ้นอยู่กับกรอบของ Spring ซึ่งอาจเป็นสาเหตุว่าทำไมมันถึงไม่ได้ผลสำหรับ Daniel
EricGreg

มันปลอดภัยกว่าเพราะถ้าคุณไม่สามารถเปลี่ยนค่าผ่าน commandline / environment มันยังคงเป็น POM และบิลด์ที่ถูกต้องจากค่าในคุณสมบัติ
foo

20

นอกจากนี้ยังให้แน่ใจว่าคุณตัวแปรสภาพแวดล้อมจะประกอบไปด้วยตัวพิมพ์ตัวอักษร .... ผมไม่ทราบว่าทำไม (เอกสารไม่ได้พูดอะไรเกี่ยวกับเรื่องนี้อย่างชัดเจนอย่างน้อยการเชื่อมโยงที่มีให้โดย @Andrew สีขาว) แต่ถ้า ตัวแปรเป็นคำตัวพิมพ์เล็ก (เช่น env.dummy) ตัวแปรจะว่างเสมอหรือเป็นโมฆะ ...

ฉันกำลังดิ้นรนกับเรื่องนี้เช่นหนึ่งชั่วโมงจนกว่าฉันจะตัดสินใจลองใช้กรณีที่หลากหลายและแก้ไขปัญหาได้

ตกลงตัวแปรตัวอย่าง:

  • DUMMY
  • DUMMY_ONE
  • JBOSS_SERVER_PATH

( หมายเหตุ : ฉันใช้ maven v3.0.5)

ฉันหวังว่านี่จะช่วยใครซักคน ....


5
ตัวแปรสภาพแวดล้อมในยูนิกซ์เป็นแบบตรงตัวพิมพ์เล็กและได้รับชื่อตัวพิมพ์ใหญ่แบบดั้งเดิมดังนั้นเมื่อคุณดูตัวแปรที่ตั้งค่าไว้ในเชลล์คุณสามารถแยกแยะความแตกต่างได้อย่างง่ายดายซึ่งตั้งค่าไว้ในเชลล์ของคุณและกระบวนการลูก ตัวแปรสภาพแวดล้อมใน Windows ดูเหมือนจะไม่ตรงตามตัวพิมพ์ใหญ่ - เล็ก แต่ฉันยังไม่ได้ตรวจสอบว่ามาจากเอกสารประกอบจากการทดลองเพียงเล็กน้อยที่พร้อมท์คำสั่ง
ทำให้ถูกกฎหมาย

11

เราไม่สามารถใช้

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

โดยนัยเมื่อเทียบกับเมื่อคุณส่งผ่านด้วย -D ที่ทำให้ชัดเจนและแทนที่ค่าคุณสมบัติเริ่มต้นซึ่งอาจยังมีประโยชน์ในการตั้งค่าสภาพแวดล้อมการกำหนดค่าศูนย์ (เช่น dev)
Technoshaft

1
มันใช้ได้ไหม? ฉันได้ลองใช้มาแล้วและอย่างน้อยก็ไม่ได้อยู่ในสภาพแวดล้อมของฉัน
user26270

3

ฉันกำลังดิ้นรนกับสิ่งเดียวกันเรียกใช้เชลล์สคริปต์ที่ตั้งค่าตัวแปรแล้วต้องการใช้ตัวแปรใน pom ที่ใช้ร่วมกัน เป้าหมายคือเพื่อให้ตัวแปรสภาพแวดล้อมแทนที่สตริงในไฟล์โครงการของฉันโดยใช้ com.google.code.maven-replacer-plugin

ใช้${env.foo}หรือ${env.FOO}ไม่ได้ผลกับฉัน Maven ไม่พบตัวแปร สิ่งที่ใช้ได้คือส่งผ่านตัวแปรในเป็นพารามิเตอร์บรรทัดคำสั่งใน Maven นี่คือการตั้งค่า:

  1. ตั้งค่าตัวแปรในเชลล์สคริปต์ หากคุณเปิดใช้ Maven ในสคริปต์ย่อยตรวจสอบให้แน่ใจว่าตัวแปรได้รับการตั้งค่าแล้วเช่นใช้source ./maven_script.shเพื่อเรียกใช้จากสคริปต์หลัก

  2. ใน shared-pom สร้างพารามิเตอร์บรรทัดคำสั่งที่คว้าตัวแปรสภาพแวดล้อม:

<ปลั๊กอิน>
  ...
  <ประหารชีวิต>
    <ประหารชีวิต>
    ...
      <การดำเนินการ>
      ...
        <configuration>
          <param> $ {foo} </param> <! - โปรดทราบว่านี่คือ * ไม่ใช่ * $ {env.foo} ->
        </ configuration>
  1. ใน ${foo}com.google.code.maven-ทดแทนปลั๊กอินให้ค่าทดแทน

  2. ในเชลล์สคริปต์ของฉันที่เรียก maven ให้เพิ่มสิ่งนี้ในคำสั่ง: -Dfoo=$foo


0

คุณสามารถใช้<properties>แท็กเพื่อกำหนดตัวแปรที่กำหนดเองและ${variable}รูปแบบที่จะใช้

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