环境变量对java不可见

时间:2012-05-10 07:59:56

标签: c# java environment-variables

项目

该项目是一个大型C#项目,用于测试自动化。为此,我将使用java工具,该工具将所有结果保存到可以加载到测试环境中的文件中。

界面

我从使用C ++构建的测试环境的供应商处获得了一个DLL,这个DLL加载了java环境并加载了jar文件。

现状

java环境加载成功,使用此方法在C#中设置环境变量:

String java = GetJavaInstallationPath();
Environment.SetEnvironmentVariable("PATH", String.Format("{0};{1}", Environment.GetEnvironmentVariable("PATH"), Path.Combine(java, @"bin\client")), EnvironmentVariableTarget.Process);

在此之后,我使用以下代码设置了java类的路径:

Environment.SetEnvironmentVariable("ITEPCLASSPATH",
                String.Format("{0};{1}",
                Path.Combine(iTepPath, "itep.jar"),
                Path.Combine(iTepPath, "libs\\itorx.jar")), EnvironmentVariableTarget.Process);

实际应该有效,它在使用Environment.GetEnvironmentVariable("ITEPCLASSPATH")时显示正确的值,但C ++ - DLL告诉我它不起作用。

使用外部bat文件设置类路径时,它可以正常工作。更多事实:

  • 应用程序由bat文件启动
  • 从我生成的dll路径
  • 复制路径
  • 我不评论任何内容,因此路径仍由C#
  • 设置

似乎java没有访问我在C#中设置的env.-variable,但认识到我在bat文件中设置了它。

我真的需要通过C#设置变量,如何存档?

3 个答案:

答案 0 :(得分:1)

它没有明确写在Microsoft System.Environment documentation中,但目标值Process似乎只限制了当前进程的范围。默认情况下,the CreateProcess method会继承子进程的当前进程环境。也许在那里使用的参数打破了这种默认行为。

所以我建议您先在EnvironmentVariableTarget.User中使用SetEnvironmentVariable进行测试,看看它是否效果更好。

顺便说一句,我认为您必须使用Process Monitor等工具诊断更多环境变量并创建流程操作。

答案 1 :(得分:1)

确保环境变量适用于每个目标:Process,User和Machine。请参阅此MSDN文章。

// Set the environment variable for the default target (the current process).
Console.WriteLine(fmt2x, "(default)", myVarA, existsA);
Environment.SetEnvironmentVariable(myVarA, existsA);

// Set the environment variable for the the current process.
Console.WriteLine(fmt2x, "Process", myVarB, existsB);
Environment.SetEnvironmentVariable(myVarB, existsB, 
    EnvironmentVariableTarget.Process);

// Set the environment variable for the the current user.
Console.WriteLine(fmt2x, "User", myVarC, existsC);
Environment.SetEnvironmentVariable(myVarC, existsC, 
    EnvironmentVariableTarget.User);

// Set the environment variable for the the local machine.
Console.WriteLine(fmt2x, "Machine", myVarD, existsD);
Environment.SetEnvironmentVariable(myVarD, existsD, 
    EnvironmentVariableTarget.Machine);

答案 2 :(得分:0)

Java允许您使用以下命令将环境变量作为参数传递:

java -DMYPROP=MYVALUE myclass.class

参数语法。看看-D标志。

然后,这些系统属性将应用于该JVM流程实例。这不比试图修改操作系统环境简单吗?