Bagaimana cara merujuk variabel lingkungan di POM.xml?

172

Saya menggunakan pakar sebagai alat bantu. Saya telah menetapkan variabel lingkungan bernama env. Bagaimana saya bisa mendapatkan akses ke nilai variabel lingkungan ini dalam pom.xmlfile?

pengguna1016403
sumber
7
Anda dapat merujuknya dengan $ {env.XXXXXXXX} di mana XXXXXXXX adalah nama variabel Anda. Misalnya $ {env.PATH} akan memberikan referensi PATH.
Seshagiri
2
Tapi Anda mungkin tidak seharusnya. Jika Anda membuat bangunan Anda bergantung pada lingkungan Anda, mereka akan lebih sulit untuk diperbanyak.
Stephen C
5
@StephenC Saya tidak akan mengatakan "tidak boleh", tapi "sangat hati-hati." Terkadang lingkungan CI dan lingkungan pengembang lokal terlihat berbeda dan variabel lingkungan adalah cara untuk mengisi kesenjangan.
Andrew White
1
Bagi saya, IntelliJ 2019 menunjukkan ${env.XYZ}referensi sebagai merah. Variabel diperluas dengan benar saat runtime tetapi ditampilkan sebagai merah pada waktu kompilasi. Karena itu saya memiliki pertanyaan yang sama dengan yang awalnya ditanyakan.
Djangofan
1
Ya, itu @MarkHan
djangofan

Jawaban:

216

Lihat Panduan Properti Maven ...

Seperti yang Seshagiri tunjukkan dalam komentar, ${env.VARIABLE_NAME}akan melakukan apa yang Anda inginkan.

Saya akan menambahkan satu kata peringatan dan mengatakan bahwa pom.xmlharus benar-benar menggambarkan proyek Anda jadi silakan gunakan variabel lingkungan dengan bijaksana. Jika Anda membuat bangunan Anda bergantung pada lingkungan Anda, mereka akan lebih sulit untuk diperbanyak

Andrew White
sumber
3
Selain itu, itu membuat platform Anda dan sistem bergantung.
lhunath
12
Be Cautions: semua karakter variable_name di pom Anda harus dalam huruf besar untuk menjadi platform independen. Karena itu hanya berlaku dalam bentuk huruf besar yang berjalan pada OS Windows. Misalnya, $ {env.M2_HOME} valid, $ {env.m2_home} tidak valid, bahkan jika Anda mendefinisikan variabel lingkungan bernama m2_home.
Jeff Liu
Saya memilikinya di properti Windows Environment (WL_HOME = c: \ apps \ Weblogic12 \ wlserver_12.1) tetapi dalam pom, ini mengembalikan nilai ini c: \ apps \ Weblogic12 \ wlserver (tanpa_12.1) ada ide di mana maven lain mungkin memilih ini naik dari?
Anand Rockzz
Baru menyadari bahwa saya mendefinisikan <wl_home> $ {WL_HOME} </wl_home> yang benar dan menggunakannya dan entah bagaimana itu disebut tanpa versi jika saya melakukannya.
Anand Rockzz
Ini berfungsi dengan baik di Windows untuk IDE & CLI. Untuk MacOS / Linux / Unix agak sulit untuk mendapatkan dukungan dari IDE di mana tidak diragukan lagi untuk Terminal , Ini berfungsi dengan baik.
Md Shahed Hossain
29

Mungkin lebih aman untuk langsung mengirimkan variabel lingkungan ke properti sistem pakar. Misalnya, katakan pada Linux Anda ingin mengakses variabel lingkungan MY_VARIABLE. Anda dapat menggunakan properti sistem dalam file pom Anda.

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

Tetapkan nilai properti pada baris perintah pakar:

mvn clean package -Dmy.variable=$MY_VARIABLE
EricGreg
sumber
4
mengapa ini lebih aman?
weberjn
Ini tidak berfungsi untuk saya, nilai baru my.variable yang disediakan pada baris perintah tidak pernah menimpa nilai di blok <properties>. Ada ide?
Daniel Scott
Bagi saya lebih aman, atau setidaknya kurang misterius, properti b / c dapat dijelaskan dalam file properti. Namun, saya menyadari solusi saya bergantung pada kerangka Spring, yang mungkin mengapa itu tidak berhasil untuk Daniel.
EricGreg
lebih aman karena jika Anda gagal mengubah nilai melalui commandline / environment, itu masih POM yang valid dan dibangun, dari nilai di properti.
foo
20

Juga, pastikan bahwa Anda variabel lingkungan yang terdiri hanya dengan UPPER CASE HURUF .... Aku tidak tahu mengapa (dokumentasi tidak mengatakan apa-apa eksplisit tentang hal itu, setidaknya link yang diberikan oleh @ Andrew Putih), tetapi jika variabelnya adalah huruf kecil (mis. env.dummy), variabel selalu kosong atau kosong ...

Saya berjuang dengan ini seperti satu jam, sampai saya memutuskan untuk mencoba KASUS YANG BERBAGAI, dan masalah terpecahkan.

Contoh Variabel OK:

  • DUMMY
  • DUMMY_ONE
  • JBOSS_SERVER_PATH

( Catatan : saya menggunakan maven v3.0.5)

Semoga ini bisa membantu seseorang ....

Carlitos Way
sumber
5
Variabel lingkungan di unix peka huruf besar kecil dan secara tradisional diberi nama huruf besar sehingga ketika Anda melihat variabel yang diatur dalam shell Anda, Anda dapat dengan mudah membedakan mana yang ditetapkan secara lokal ke shell Anda dan yang terlihat oleh proses anak. Variabel lingkungan di Windows tampaknya tidak peka terhadap huruf besar-kecil, tetapi saya belum memverifikasi itu dari dokumentasi, hanya dari percobaan kecil di command prompt.
melegalkan
11

Tidak bisakah kita menggunakan

<properties>
    <my.variable>${env.MY_VARIABLE}</my.variable>
</properties>
tmjee
sumber
Tersirat, berlawanan dengan ketika Anda mengirimkannya dengan -D yang membuatnya eksplisit dan menimpa nilai properti default, yang mungkin masih berguna untuk mensetup lingkungan konfigurasi nol (mis. Dev)
Technoshaft
1
Apakah ini berhasil? Saya sudah mencobanya dan tidak, setidaknya tidak di lingkungan saya
user26270
3

Saya berjuang dengan hal yang sama, menjalankan skrip shell yang mengatur variabel, kemudian ingin menggunakan variabel di shared-pom. Tujuannya adalah agar variabel lingkungan mengganti string dalam file proyek saya menggunakan com.google.code.maven-replacer-plugin.

Menggunakan ${env.foo} atau ${env.FOO}tidak bekerja untuk saya. Maven tidak menemukan variabel. Apa yang berhasil adalah melewatkan variabel sebagai parameter baris perintah di Maven. Ini pengaturannya:

  1. Atur variabel dalam skrip shell. Jika Anda meluncurkan Maven dalam sebuah sub-skrip, pastikan variabelnya sudah diatur, misalnya menggunakansource ./maven_script.sh untuk memanggilnya dari skrip induk.

  2. Di shared-pom, buat param baris perintah yang mengambil variabel lingkungan:

<plugin>
  ...
  <Eksekusi>
    <Eksekusi>
    ...
      <eksekusi>
      ...
        <konfigurasi>
          <param> $ {foo} </param> <! - Perhatikan ini * tidak * $ {env.foo} ->
        </configuration>
  1. Di com.google.code.maven-replacer-plugin, buat nilai penggantian ${foo}.

  2. Dalam skrip shell saya yang memanggil pakar, tambahkan ini ke perintah: -Dfoo=$foo

fjones
sumber
0

Anda dapat menggunakan <properties>tag untuk menentukan variabel dan ${variable}pola khusus untuk menggunakannya

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