Java 带Maven的环境变量

Java 带Maven的环境变量,java,maven,environment-variables,Java,Maven,Environment Variables,我已经将一个项目从Eclipse移植到Maven,我需要设置一个环境变量使我的项目工作 在Eclipse中,我转到“运行->运行配置”,在“环境”选项卡下,我将“WSNSHELL\u HOME”设置为值“conf” 我怎样才能和Maven一起做到这一点 多谢各位 您可以在命令行上传递它,如下所示 mvn -DmyVariable=someValue install [Update]请注意,参数的顺序很重要-您需要在命令之前指定任何选项。[/Update] 在POM文件中,可以将系统变量(在命令

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

在Eclipse中,我转到“运行->运行配置”,在“环境”选项卡下,我将“WSNSHELL\u HOME”设置为值“conf”

我怎样才能和Maven一起做到这一点


多谢各位

您可以在命令行上传递它,如下所示

mvn -DmyVariable=someValue install
[Update]请注意,参数的顺序很重要-您需要在命令之前指定任何选项。[/Update]

在POM文件中,可以将系统变量(在命令行或POM中指定)引用为
${myVariable}
,将环境变量引用为
${env.myVariable}
。(感谢评论人士的更正。)

更新2 好的,那么您希望将系统变量传递给测试。如果-我假设-您使用用于测试,最好是在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>

...
org.apache.maven.plugins
maven surefire插件
...
...
形态
...

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

mvn -DargLine="-DWSNSHELL_HOME=conf" test

使用
System.getProperty
读取代码中的值。查看一下关于
System.getenv
Sytem.getProperty

之间区别的帖子。有一个名为this one的maven插件提供了一个设置系统变量的目标
set System properties
。如果您有一个包含所有这些属性的文件,这将特别有用。因此,您可以读取属性文件并将其设置为系统变量。

另一种解决方案是在
${user.home}/.mavenrc
(或windows上的
%home%\mavenrc\u pre.bat
中设置
MAVEN\u选项(或其他环境变量)

由于Maven 3.3.1有,如果这是您真正想要的:

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

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

#!/bin/bash

export YOUR_VAR=thevalue
mvn test
unset YOUR_VAR

对于Maven中的环境变量,可以设置如下


org.apache.maven.plugins
maven故障保护插件
...
...
形态
在代码中添加:

System.getProperty(“WSNSHELL\u HOME”)

通过maven命令修改或添加值属性:

mvn clean test -DargLine=-DWSNSHELL_HOME=yourvalue
如果您想在Eclipse中运行它,请在调试/运行配置中添加VM参数

  • 转到运行->运行配置
  • 选择选项卡参数
  • 附加模块节VM参数
-DWSNSHELL_HOME=您的价值


您无需修改@Kevin答案中的POM

以下文档。下面的文档为我使用maven sure fire插件设置环境变量提供了帮助

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

org.apache.maven.plugins
maven surefire插件
形态

您可以通过
\u JAVA\u 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
(它会自动选择
\u JAVA\u选项
)。

我建议使用这个神奇的工具。使用它,您可以在将cd插入项目后注入环境变量。这些步骤对我很有效:

.envrc文件

source_up
dotenv
.env文件

_JAVA_OPTIONS="-DYourEnvHere=123"

我需要启动“mvn测试”,它似乎不起作用,因为如果我编写mvn测试-DWSNSHELL_HOME=conf,我仍然会得到异常java.io.FileNotFoundException:null/wsnshell.conf(没有这样的文件或目录)@Janky,换个方式试试,也就是说,
mvn-DWSNSHELL_HOME=conf测试
.nope…:(我仍然得到java.io.FileNotFoundException:null/wsnshell.conf(没有这样的文件或目录)…在代码中,我以这种方式读取变量..
System.getenv(“wsnshell\u HOME”)
正确吗?@Janky,等一下,你是直接从Maven版本运行应用程序,还是…?你们两个把环境变量和系统属性混淆了。命令-D选项只设置系统属性。我建议让你的项目在不使用环境变量的情况下运行。然后转到Maven。没有理由跳过该选项如果环境变量对您的系统有用,并且我确信我的解决方案是有效的(我自己使用)。请参阅我的提示重构'system.getenv'/'system.getProperty'。您应该使用system.getProperty(“WSNSHELL\u HOME”)阅读该属性在花了很多时间尝试其他东西之后,我没有使用System.getenv.Perfect,而是使用了这个。如果您在pom.xml中为surefire插件配置了argLine参数,那么添加
${argLine}
占位符,否则将不会拾取命令行中的参数。示例:
-Duser.timezone=UTC${argLine}
这对我来说很有效,谢谢!这是一个为maven测试配置sys props的好工具。乍一看,它仍然很混乱,为什么它不能直接使用它们,但需要一个额外的参数。令人难以置信的是,这是唯一一个使用Surefire插件对我完全有效的方法。在我在POM中设置的大约10个环境变量中,t测试运行时没有看到其中两个。即使我在shell中设置了它们,然后在mvn安装中设置了它们,它们仍然以某种方式被隐藏。但是,如果我从shell脚本运行,它工作得很好!我希望我理解为什么会发生这种情况。我相信这应该是一个公认的答案,因为这是最简单的解决方案
_JAVA_OPTIONS="-DYourEnvHere=123"