Variabel Lingkungan dengan Maven

87

Saya telah memindahkan proyek dari Eclipse ke Maven dan saya perlu menetapkan variabel lingkungan agar proyek saya berfungsi.

Di Eclipse, saya pergi ke "Run -> Run configurations" dan, di bawah tab "environment", saya set "WSNSHELL_HOME" ke nilai "conf".

Bagaimana saya bisa melakukan ini dengan Maven?

Terima kasih banyak!

Gianluca
sumber
Saya akan menyarankan untuk menjalankan proyek Anda tanpa variabel lingkungan. Dan kemudian pindah ke maven.
khmarbaise
3
Tidak ada alasan untuk melewatkan penggunaan variabel lingkungan jika berguna untuk sistem Anda dan saya yakin solusi saya berfungsi (saya menggunakannya sendiri). Lihat petunjuk saya mengacu pada 'System.getenv' / 'System.getProperty'.
FrVaBe

Jawaban:

124

Anda bisa meneruskannya di baris perintah, sebagai

mvn -DmyVariable=someValue install

[Perbarui] Perhatikan bahwa urutan parameternya signifikan - Anda perlu menentukan opsi apa pun sebelum perintah. [/Memperbarui]

Di dalam file POM, Anda dapat merujuk ke variabel sistem (ditentukan pada baris perintah, atau di pom) sebagai ${myVariable}, dan variabel lingkungan sebagai ${env.myVariable}. (Terima kasih kepada pemberi komentar atas koreksinya.)

Pembaruan2

Oke, jadi Anda ingin meneruskan variabel sistem Anda ke pengujian Anda. Jika - seperti yang saya asumsikan - Anda menggunakan plugin Surefire untuk pengujian, yang terbaik adalah menentukan variabel sistem yang diperlukan di dalam pom, di pluginsbagian Anda , misalnya

<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>
Péter Török
sumber
Saya perlu meluncurkan 'mvn test', sepertinya tidak berhasil, karena jika saya menulis mvn test -DWSNSHELL_HOME = conf Saya masih mendapatkan pengecualian java.io.FileNotFoundException: null / wsnshell.conf (Tidak ada file atau direktori seperti itu)
Gianluca
2
@Janky, coba sebaliknya, yaitu mvn -DWSNSHELL_HOME=conf test.
Péter Török
tidak ... :( Saya masih mendapatkan java.io.FileNotFoundException: null / wsnshell.conf (Tidak ada file atau direktori seperti itu) ... dalam kode saya membaca variabel dengan cara ini .. System.getenv("WSNSHELL_HOME");apakah itu benar?
Gianluca
@Janky, tunggu sebentar, apakah Anda menjalankan aplikasi langsung dari build Maven, atau ...?
Péter Török
47
Kalian berdua membingungkan Variabel Lingkungan dengan Properti Sistem. Opsi perintah -D hanya mengatur Properti Sistem.
Wouter Lievens
26

The -Dproperti tidak akan diandalkan diperbanyak dari jitu-pluging untuk menguji Anda (saya tidak tahu mengapa ia bekerja dengan gerhana). Saat menggunakan maven pada baris perintah, gunakan properti argLine untuk menggabungkan properti Anda. Ini akan membuat mereka lulus ujian

mvn -DargLine="-DWSNSHELL_HOME=conf" test

Gunakan System.getPropertyuntuk membaca nilai dalam kode Anda. Lihat posting ini tentang perbedaan System.getenvdan Sytem.getProperty.

FrVaBe
sumber
2
Anda harus membaca properti dengan System.getProperty ("WSNSHELL_HOME") daripada menggunakan System.getenv.
FrVaBe
Sempurna, setelah menghabiskan BANYAK waktu untuk mencoba hal lain, yang satu ini berhasil untuk saya.
Bhushan
Jika Anda telah mengkonfigurasi parameter argLine untuk plugin yang pasti di pom.xml Anda, tambahkan ${argLine}placeholder, jika tidak, parameter dari baris perintah tidak akan diambil. Contoh:<argLine>-Duser.timezone=UTC ${argLine}</argLine>
sorrymissjackson
Ini berhasil untuk saya, terima kasih! Alat yang bagus untuk mengkonfigurasi sys-props untuk tes maven. Masih sekilas memang sangat membingungkan, mengapa tidak bisa menggunakannya secara langsung, tapi membutuhkan argumen ekstra.
phi
10

Anda bisa membungkus perintah maven Anda dalam skrip bash:

#!/bin/bash

export YOUR_VAR=thevalue
mvn test
unset YOUR_VAR
modle13
sumber
Luar biasa, ini adalah satu-satunya metode yang benar-benar berfungsi untuk saya menggunakan plugin Surefire. Dari 10 atau lebih env vars yang saya tetapkan di POM, dua di antaranya tidak terlihat saat pengujian dijalankan. Bahkan jika saya meletakkannya di cangkang dan kemudian mvn install, entah bagaimana mereka masih dikaburkan. Namun, jika saya menjalankan dari skrip shell, itu berfungsi dengan baik! Saya berharap saya mengerti mengapa ini terjadi.
Pete
Saya percaya ini harus menjadi jawaban yang diterima karena ini adalah solusi paling sederhana
wtsiamruk
5

Untuk variabel lingkungan di Maven, Anda dapat mengatur di bawah ini.

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

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

Ada sebuah plugin maven bernama properties-maven-plugin yang satu ini memberikan tujuan set-system-propertiesuntuk mengatur variabel sistem. Ini sangat berguna jika Anda memiliki file yang berisi semua properti ini. Jadi Anda dapat membaca file properti dan mengaturnya sebagai variabel sistem.

Kristen
sumber
3

Solusi lain adalah mengatur MAVEN_OPTS(atau variabel lingkungan lainnya) di ${user.home}/.mavenrc(atau %HOME%\mavenrc_pre.batdi windows).

Sejak Maven 3.3.1 ada kemungkinan baru untuk mengatur parameter baris perintah mvn , jika ini yang Anda inginkan:

  • ${maven.projectBasedir}/.mvn/maven.config
  • ${maven.projectBasedir}/.mvn/jvm.config
René
sumber
1

di kode Anda tambahkan:

System.getProperty("WSNSHELL_HOME")

Ubah atau tambahkan properti nilai dari perintah maven:

mvn clean test -DargLine=-DWSNSHELL_HOME=yourvalue

Jika Anda ingin menjalankannya di Eclipse, tambahkan argumen VM dalam konfigurasi Debug / Run Anda

  • Pergi ke Jalankan -> Jalankan konfigurasi
  • Pilih Argumen Tab
  • Tambahkan di bagian Argumen VM

-DWSNSHELL_HOME = nilaiAnda

Lihat contoh gambar

Anda tidak perlu memodifikasi POM

Luis Eduardo Blandon Puello
sumber
1

Berikut dokumentasi dari jawaban @ Kevin, yang di bawah ini berfungsi untuk saya untuk mengatur variabel lingkungan dengan 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>
Yuvaraj G
sumber
0

Anda dapat meneruskan beberapa argumen melalui _JAVA_OPTIONSvariabel.

Misalnya, tentukan variabel untuk tanda proxy maven seperti ini:

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

Dan kemudian gunakan mvn clean install(secara otomatis akan mengambil _JAVA_OPTIONS).

Davis Benny
sumber