使用Maven的环境变量


85

我已经将一个项目从Eclipse移植到Maven,并且需要设置一个环境变量以使我的项目正常工作。

在Eclipse中,转到“运行->运行配置”,然后在“环境”选项卡下,将“ WSNSHELL_HOME”设置为值“ conf”。

我如何使用Maven做到这一点?

非常感谢你!


我建议让您的项目在没有环境变量的情况下运行。然后转到行家。
khmarbaise 2011年

3
如果环境变量对您的系统有用,则没有理由跳过环境变量的使用,而且我确信我的解决方案可以工作(我自己使用)。请参阅我关于“ System.getenv” /“ System.getProperty”的提示。
FrVaBe

Answers:


120

您可以只在命令行中传递它,因为

mvn -DmyVariable=someValue install

[更新]请注意,参数的顺序很重要-您需要在命令之前指定任何选项。[/更新]

在POM文件中,您可以将系统变量(在命令行或pom中指定)称为${myVariable},将环境变量称为${env.myVariable}(感谢评论者的纠正。)

更新2

好的,因此您想将系统变量传递给测试。如果(按照我的假设)您使用Surefire插件进行测试,则最好是在您的plugins部分的pom中指定所需的系统变量,例如

<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

2
@Janky,反过来尝试,即mvn -DWSNSHELL_HOME=conf test
彼得Török

不,... :(我仍然得到java.io.FileNotFoundException:null / wsnshell.conf(没有这样的文件或目录)...在代码中,我以这种方式读取变量..System.getenv("WSNSHELL_HOME");是否正确?
Gianluca

@Janky,请稍等,您是直接从Maven构建中运行应用程序,还是...?
彼得Török

43
你们两个使环境变量与系统属性混淆。-D命令选项仅设置系统属性。
Wouter Lievens 2014年

25

这些-D属性将无法可靠地从surefire-pluging传播到您的测试(我不知道为什么它在eclipse中起作用)。在命令行上使用maven时,请使用argLine属性来包装您的属性。这将使它们通过您的测试

mvn -DargLine="-DWSNSHELL_HOME=conf" test

使用System.getProperty读取你的代码的值。看看到这个职位有关的差异System.getenvSytem.getProperty


2
您应该使用System.getProperty(“ WSNSHELL_HOME”)阅读该属性,而不是使用System.getenv。
FrVaBe 2011年

完美,在花了很多时间尝试其他东西之后,这个为我工作了。
Bhushan 2014年

如果您在pom.xml中为surefire插件配置了argLine参数,请添加${argLine}占位符,否则将不会从命令行中提取参数。示例:<argLine>-Duser.timezone=UTC ${argLine}</argLine>
对不起,您错过了

这对我有用,谢谢!多么好的工具,可以为Maven测试配置sys-props。乍一看,这非常令人困惑,为什么它不能直接使用它们,却需要一个额外的论据。
phi

9

您可以将maven命令包装在bash脚本中:

#!/bin/bash

export YOUR_VAR=thevalue
mvn test
unset YOUR_VAR

令人难以置信的是,这是使用Surefire插件对我完全起作用的唯一方法。我在POM中设置的大约10个环境变量中,有两个在测试运行时看不到。即使我将它们放在shell中然后mvn install,它们仍然会以某种方式被遮盖。但是,如果我从shell脚本运行,它将正常工作!我希望我理解为什么会这样。
皮特

我认为这应该是一个可以接受的答案,因为这是最简单的解决方案
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 #环境变量

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


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命令修改或添加value属性:

mvn clean test -DargLine=-DWSNSHELL_HOME=yourvalue

如果要在Eclipse中运行,请在Debug / Run配置中添加VM参数

  • 转到运行->运行配置
  • 选择选项卡参数
  • 在“ VM参数”部分中添加

-DWSNSHELL_HOME =您的值

查看图片示例

您不需要修改POM


0

遵循@ Kevin's Answer的文档,以下内容适用于我使用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代理标志定义一个变量,如下所示:

_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)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.