GVKun编程网logo

如何在Windows中的ProcessBuilder Java中设置PATH环境变量(java环境变量path怎么设置)

9

此处将为大家介绍关于如何在Windows中的ProcessBuilderJava中设置PATH环境变量的详细内容,并且为您解答有关java环境变量path怎么设置的相关问题,此外,我们还将为您介绍关于

此处将为大家介绍关于如何在Windows中的ProcessBuilder Java中设置PATH环境变量的详细内容,并且为您解答有关java环境变量path怎么设置的相关问题,此外,我们还将为您介绍关于0 Linux下Java使用ProcessBuilder执行命令与直接Bash执行命令之间的不同(环境变量方面)、1.4.2 设置PATH环境变量、golang 在windows中设置环境变量的操作、Java ProcessBuilder process.destroy()不会杀死WinXP中的子进程的有用信息。

本文目录一览:

如何在Windows中的ProcessBuilder Java中设置PATH环境变量(java环境变量path怎么设置)

如何在Windows中的ProcessBuilder Java中设置PATH环境变量(java环境变量path怎么设置)

我正在尝试为Java中的流程构建器设置PATH环境变量,我尝试了以下操作:

ProcessBuilder pb = new ProcessBuilder(command);
Map<String,String> mp = pb.environment();
mp.put("Path","myPath");
pb.start();

但是以下操作无效,流程构建器选择了默认系统路径。

0 Linux下Java使用ProcessBuilder执行命令与直接Bash执行命令之间的不同(环境变量方面)

0 Linux下Java使用ProcessBuilder执行命令与直接Bash执行命令之间的不同(环境变量方面)

0 问题发生

xiaojietest.java

package tasks;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Writer;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang3.SystemUtils;

import database.Tools;
import util.FixPath;
import util.StreamGobbler;

public class xiaojietest {
	public static void main(String args[]) throws SQLException {
		try {
			String cmd="\""+"/home/xiaojie/Desktop/xiaojiework/BigCloneEval/sample/nicadRunner"+ "\" \"" + "/home/xiaojie/Desktop/xiaojiework/BigCloneEval/ijadataset/bcb_reduced/5"+"\"";
			System.out.println(cmd);
			String cmd1="bash";
			//String cmd2="--help";
			String cmd2="-c";
			//String [] exec = {cmd1,cmd2};
			//String [] exec = {"bash", "-c", "\""+"/home/xiaojie/Desktop/xiaojiework/BigCloneEval/commands/../sample/nicadRunner"+ " " + "/home/xiaojie/Desktop/xiaojiework/BigCloneEval/ijadataset/bcb_reduced/5"+"\""};
			//String [] exec = {"bash", "--help"};
			//String [] exec = {"bash", "-c",cmd};
			String [] exec = {cmd1,cmd2,cmd};
			//String[] exec= {"ls"};
			ProcessBuilder pb = new ProcessBuilder(exec);
			//pb.directory(new File("/home/xiaojie/Desktop/xiaojiework/BigCloneEval/commands/../sample/"));
			Process p = pb.start();
			Map<String, String>env=pb.environment();
			//xiaojie output environment
			Set<String> key=env.keySet();
			for(Iterator<String>it=key.iterator();it.hasNext();) {
				String s=it.next();
				System.out.println(s+":"+env.get(s));
			}
			//new StreamGobbler(p.getErrorStream()).start();
			String line = null;
			BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
			
			Path output=Paths.get("/home/xiaojie/Desktop/xiaojiework/data_for_experiment/nicadOutPutFile/nicad.clones");
			
			output = FixPath.getAbsolutePath(output);
			output = output.toAbsolutePath();
			BufferedWriter out = new BufferedWriter(new FileWriter(output.toFile()));
			//System.out.println(br.read());
			while((line = br.readLine()) != null) {
				System.out.println(line);
				line = line.trim();
				if(!line.equals("")) {
					out.write(line + "\n");
				}
			}
			int retval = p.waitFor();
			br.close();
			System.out.println("retval:"+retval);
		} catch (Exception e) {
			e.printStackTrace(System.err);
		}
	}
}

上述代码期望通过Java程序执行如下脚本

/home/xiaojie/Desktop/xiaojiework/BigCloneEval/sample/nicadRunner

并且传入参数:

/home/xiaojie/Desktop/xiaojiework/BigCloneEval/ijadataset/bcb_reduced/5

nicadRunner的脚本内容是:

#!/bin/bash

# This tool runner works with the myconfig.cfg nicad configuration file included
# You will need to modify the hard-coded installation below before running
# Test this out on one of the IJaDataset directories (such as 11/) to test and 
# see that clones are detected and output in the correct format for BigCloneEval
# as specified in the readme.

ulimit -s hard

root=`dirname $1`
dir=`basename $1`
path=$root/$dir

# Go to NiCad installation directory
cd /home/xiaojie/Desktop/xiaojiework/NiCad-5.0/

# Execute NiCad, Suppress Output
./nicad5 functions java "$path" myconfig > /dev/null 2> /dev/null

# Convert Detected Clones Into BigCloneEval Format
java -jar Convert.jar ${path}_functions-blind-abstract-clones/${dir}_functions-blind-abstract-clones-0.30.xml 2> /dev/null

#cat ${path}_functions-blind-abstract-clones/${dir}_functions-blind-abstract-clones-0.30.xml | sed ''s$<source file="$$g'' | sed ''s$" startline="$,$g'' | sed ''s$" endline="$,$g'' | sed ''s$" pcid=.*"></source>$$g'' | sed ''s$<clone nlines=.*$$g'' | sed ''s$</clone>.*$$g'' | sed ''s$</clones>$$g'' |sed ''s$<clones>$$g'' | sed ''s$<cloneinfo.*$$g'' | sed ''s$<systeminfo.*$$g'' | sed ''s$<runinfo.*$$g'' | sed ''/^$/d'' | paste -d '','' - - | sed "s#${path}/##g" | sed ''s#/#,#g''

# Cleanup
rm -rf ${path}_functions-blind-abstract-clones > /dev/null 2> /dev/null
rm ${path}_functions-blind-abstract.xml > /dev/null 2> /dev/null
rm ${path}_functions-clones*.log > /dev/null 2> /dev/null
rm ${path}_functions-blind.xml > /dev/null 2> /dev/null
rm ${path}_functions.xml > /dev/null 2> /dev/null

  ProcessBuilder启动进程并执行,正常的返回值(通过代码中p.waitFor()返回)是0,其余状态都说明进程执行过程报错。

针对"ls"、"bash --help"等使用上面程序执行,都无错误。

但是针对如下进程使用上述程序通过ProcessBuilder启动进程执行却一直报错:

bash -c "/home/xiaojie/Desktop/xiaojiework/BigCloneEval/sample/nicadRunner" "/home/xiaojie/Desktop/xiaojiework/BigCloneEval/ijadataset/bcb_reduced/5"

1 问题排查过程

1.1 bash -c的直接使用

首先,直接运行脚本,传入参数。没有任何错误。

 

其次,加上bash –c以后就会出错。

这是因为必须将"/home/xiaojie/Desktop/xiaojiework/BigCloneEval/sample/nicadRunner" "/home/xiaojie/Desktop/xiaojiework/BigCloneEval/ijadataset/bcb_reduced/5"作为整体传递给bash -c,而不是分开。所以如下修改即可:

1.2 通过ProcessBuilder启动进程执行bash -c

问题1:返回127错误码

String cmd="\""+"/home/xiaojie/Desktop/xiaojiework/BigCloneEval/sample/nicadRunner"+ "\" \"" + "/home/xiaojie/Desktop/xiaojiework/BigCloneEval/ijadataset/bcb_reduced/5"+"\"";
System.out.println(cmd);
String cmd1="bash";
//String cmd2="--help";
String cmd2="-c";
String [] exec = {cmd1,cmd2,cmd};
ProcessBuilder pb = new ProcessBuilder(exec);

第一,如果将cmd写作

"\"\""+"/home/xiaojie/Desktop/xiaojiework/BigCloneEval/sample/nicadRunner"+ "\" \"" + "/home/xiaojie/Desktop/xiaojiework/BigCloneEval/ijadataset/bcb_reduced/5"+"\"\"";

将该字符串打印以后会输出:

""/home/xiaojie/Desktop/xiaojiework/BigCloneEval/sample/nicadRunner" "/home/xiaojie/Desktop/xiaojiework/BigCloneEval/ijadataset/bcb_reduced/5""

从表面看,是bash -c能够接受的参数,即是一个整体。

这个时候,bash -c 将“”引号内作为一个整体看待,而不是一个脚本和一个参数,故而会提示127。

但是,对于ProcessBuilder而言,其接收该参数对其处理时,会将其当作最外层还有一层双引号。就变成了

"""/home/xiaojie/Desktop/xiaojiework/BigCloneEval/sample/nicadRunner" "/home/xiaojie/Desktop/xiaojiework/BigCloneEval/ijadataset/bcb_reduced/5"""

会报出127错误。

shell的错误码说明是:

因此,找不到nicadRunner脚本的路径。即Path不对。

问题2:返回1错误码

 我们将问题1修正以后,即cmd为

String cmd="\""+"/home/xiaojie/Desktop/xiaojiework/BigCloneEval/sample/nicadRunner"+ "\" \"" + "/home/xiaojie/Desktop/xiaojiework/BigCloneEval/ijadataset/bcb_reduced/5"+"\"";

此时,执行前述程序后,返回1错误码,即通用错误。

说明nicadRunner脚本运行了,但是没有正确运行。

采取“逐步增加行”的策略。我们运行到./nicad5的那一行时出了错误。

#!/bin/bash

# This tool runner works with the myconfig.cfg nicad configuration file included
# You will need to modify the hard-coded installation below before running
# Test this out on one of the IJaDataset directories (such as 11/) to test and 
# see that clones are detected and output in the correct format for BigCloneEval
# as specified in the readme.

ulimit -s hard

root=`dirname $1`
dir=`basename $1`
path=$root/$dir

# Go to NiCad installation directory
cd /home/xiaojie/Desktop/xiaojiework/NiCad-5.0/

# Execute NiCad, Suppress Output
./nicad5 functions java "$path" myconfig > /dev/null 2> /dev/null

而直接在客户端的命令行中用nicad命令执行,却没有错误。

为什么?

在客户端的命令行中运行nicad程序,命令行中的上下文的path是包括FreeTXL路径的,所以命令行nicad没问题。

但是,使用ProcessBuilder启动bash -c 运行nicadRunner脚本,脚本中再调用nicad程序的时候,就找不到FreeTXL路径了!

我的FreeTXL路径设置的比较特殊,是在一个私人文件夹,并且写入的path是~/.bashrc。FreeTXL是nicad工具的依赖包。我安装的时候,相关的路径信息是:

Installing TXL for xiaojie only.

Installing TXL commands into /home/xiaojie/bin

Installing TXL library into /home/xiaojie/txl/lib

Installing TXL manual entries into /home/xiaojie/txl/man/man1

Testing TXL

我在程序中添加代码:

Map<String, String>env=pb.environment();
            //xiaojie output environment
            Set<String> key=env.keySet();
            for(Iterator<String>it=key.iterator();it.hasNext();) {
                String s=it.next();
                System.out.println(s+":"+env.get(s));
            }

获取了ProcessBuilder启动的命令的上下文,然后查看一下输出

PATH:/home/xiaojie/Desktop/xiaojiework/jdk-8u191-linux-x64/jdk1.8.0_191/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

可以看到,/home/xiaojie/bin不在PATH路径中。

我当时将这个路径写入了一个bashrc文件,所以bash命令行中有该路径!

 

但是,创建ProcessBuilder时,读取的上下文,不是从bashrc中读取的。

所以不一致,所以就会导致命令行和程序中的不一样。

调试程序,跟入pb.environment();,可以看到:

进一步跟入,发现:

该函数只有一个声明。

 

初步判断是java.lang.ProcessEnvironment.environ函数。java.lang.ProcessEnvironment是java的一个类,源码被隐藏。可以直接调用。

https://www.ibm.com/developerworks/cn/java/java-random-code-from-the-perspective-of-compilation/。该网页中有Linux环境变量的读取介绍,比较复杂。

https://www.cnblogs.com/sunilsun/p/6071124.html这里是Linux环境变量的介绍。

里面提到:

(1)~/.profile:【推荐】每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。这里是推荐放置个人设置的地方
(2)~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取。不推荐放到这儿,因为每开一个shell,这个文件会读取一次,效率肯定有影响。

所以,我将路径改为写入~/.profile。重启,然后运行程序。解决。

 

 

 

 



 

 

1.4.2 设置PATH环境变量

1.4.2 设置PATH环境变量

        前面已经介绍过了,编译和运行java程序必须经过两个步骤。

        1.将源文件编译成字节码。

        2.解释执行平台无关的字节码程序。

        上面这两个步骤分别需要使用java和javac两个命令。启动Windows操作系统的命令行窗口(在“开始”菜单里运行cmd命令即可),在命令行窗口里依次输入java和javac命令,将看到如下输出:

        

C:\Users\Administrator>java
''java'' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

C:\Users\Administrator>javac
''javac'' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

        这意味着我们还不能使用java和javac两个命令。这是因为:虽然我们已经在计算机里安装了JDK,而JDK的安装路径下也包含了java和javac两个命令,但计算机不知道到哪里去找这两个命令。

        计算机如何查找命令呢?Windows操作系统根据Path环境变量来查找命令。Path环境变量的值是一系列路径,Windows操作系统将在这一系列路径中依次查找命令,如果找到这个命令,则该命令是可以执行的;否则将出现“‘XXX’不是内部或外部命令,也不是可运行的程序或批处理文件”的提示,而Linnux操作系统则根据PATH环境变量来查找命令,PATH环境变量的值也是一些列路径。因为windows操作系统不区分大小写,设置Path和PATH并没有区别;而Linux系统是区分大小写的,设置Path和PATH是有区别的,因此只需要设置PATH环境变量即可。

        提示:    不管是Linux平台还是Windows平台,只需把java和javac两个命令所在的路径添加到PATH环境变量中,就可以编译和运行java程序了。


golang 在windows中设置环境变量的操作

golang 在windows中设置环境变量的操作

安装完成后需要在系统环境变量中设置

GOPATH为项目目录

GOROOT为安装目录

path中设置好安装目录到bin目录

打开cmd,输入go env,出现如下配置生效

补充:Golang 环境变量须知

1.前言

无论你是使用 Windows、Linux 还是 Mac 操作系统来开发 Go 应用程序,在安装好 Go 安装语言开发工具之后,都必须配置好 Go 语言开发所要求的 环境变量,才算初步完成 Go 开发环境的搭建。

但对于一些初学者来说,可能不太明白 Go 语言中常用的环境变量的作用以及如何设置环境变量,下面在 Windows 环境下来讲讲。

2.查看环境变量

安装完 Go 后,我们可以使用 go env 命令查看当前 Go 的所有默认环境变量。

go env
set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\dablelv\AppData\Local\go-build
set GOENV=C:\Users\dablelv\AppData\Roaming\go\env
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=D:\go\pkg\mod
set GONOPROXY=git.code.oa.com,git.woa.com
set GONOSUMDB=git.code.oa.com,git.woa.com
set GOOS=windows
set GOPATH=D:\go
set GOPRIVATE=git.code.oa.com,git.woa.com
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=C:\Program Files\Go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=C:\Program Files\Go\pkg\tool\windows_amd64
set GCCGO=gccgo
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=D:\code\kknock\KnockKnock\application\group_srv\go.mod
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=C:\Users\dablelv\AppData\Local\Temp\go-build853783354=/tmp/go-build -gno-record-gcc-switches

也可以查到指定环境变量的值。

go env GOROOT
C:\Program Files\Go

Go 语言中可以设置的环境变量有很多,每个环境变量都有其作用,不过很多我们可能都用不到,一般需要了解下面几个最常用的就够了。

GOROOT
GOPATH
GO111MODULE
GOPROXY
GOPRIVATE
GOBIN
GOOS
GOARCH

关于环境变量的详细说明,可使用命令go help environment查询。

GOROOT

GOROOT 表示 Go 语言的安装目录。

GOROOT 的作用是用来索引 Go 语言的安装目录下的相关资源,比如 bin 目录的工具(如 go 命令),src 目录下的源码等。

GOPATH

GOPATH 用于指定我们的开发工作区,可以有多个。

按照 Go 开发规范,GOPATH 目录下一般分为三个子目录 src,pkg,bin。

src 目录存放我们需要开发的项目源码,pkg 存放依赖的包和编译后的静态库文件,bin 放源代码编译后台的可执行文件。

下面是一个 GOPATH 目录示例布局。

GOPATH=/home/user/go
/home/user/go/
    src/
        foo/
            bar/               (go code in package bar)
                x.go
            quux/              (go code in package main)
                y.go
    bin/
        quux                   (installed command)
    pkg/
        linux_amd64/
            foo/
                bar.a          (installed package object)

注意:

(1)如果 GOPATH 未显示设置,则默认为用户主目录中名为 go 的子目录。Unix 下为$HOME/go,Windows 下为%USERPROFILE%\go(一般为C:\Users\YourName\go),Plan 9 下为$home/go。

(2)使用模块时,GOPATH 不再用于解析导入,但是它仍然用于存储下载的源代码(在GOPATH/pkg/mod中)和编译的命令(在GOPATH/bin中)。

(3)使用命令go help gopath可查看 GOPATH 详细说明。

GO111MODULE

在 go1.11 的时候推出了这个 go modules 来解决依赖管理的问题。

通过变量 GO111MODULE 来控制 Go Module 的开启和关闭,取值 off、on 或 auto。

从 Go 1.13 开始,Go Module 作为 Golang 中的标准包管理器。

GOPROXY

go get 下载依赖时使用的代理地址列表,使用逗号 (,) 或竖杠 (|) 分隔。

当用 go 命令查找依赖模块时,它会按顺序访问 GOPROXY 列表中的每个代理,直到收到成功的响应或出现终端错误。

GOPROXY 中可能会存在两个关键字来代替代理URL:

off:不允许从任何源下载依赖的模块

direct: 直接从版本控制存储库下载,而不是使用模块代理

GOPROXY 缺省值为https://proxy.golang.org,direct。

GOPRIVATE

go get 通过代理服务拉取仓库时,因为代理服务不可能访问到私有仓库(一般为企业内部代码管理平台),会出现 404 错误。

go1.13 版本提供了一个方便的解决方案:GOPRIVATE 环境变量。

如:

setx GOPRIVATE=gitlab.com,git.woa.com

GOBIN

用于存储我们使用go install命令安装的程序。

如果没有设置 GOBIN,程序一般会安装到为GOPATH/bin目录。

GOOS

当前的操作系统。例如 linux、darwin、windows、netbsd、freebsd、openbsd、solaris、plan9 等。

注意 mac os对应的值是 darwin。

GOARCH

表示 CPU 架构。如 amd64、386、arm、ppc64 等。

3.小结

环境变量的设置,可以影响我们开发和编译项目的过程与结果,所以还是很有必要了解一下的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。

您可能感兴趣的文章:
  • go语言 全局变量和局部变量实例
  • golang通过反射设置结构体变量的值
  • 详解Go语言变量作用域
  • 关于Golang变量初始化/类型推断/短声明的问题
  • 浅谈golang并发操作变量安全的问题
  • go语言的初始化顺序,包,变量,init详解
  • 解决golang 关于全局变量的坑

Java ProcessBuilder process.destroy()不会杀死WinXP中的子进程

Java ProcessBuilder process.destroy()不会杀死WinXP中的子进程

我有一个Java应用程序,用于ProcessBuilder准备操作系统命令并给我一个Process对象。(实际的os命令是使用cygwin在ssh上进行rsync的)。

这在Windows中运行良好,但是,如果我想停止使用process.destroy()它的进程将不会杀死子ssh和rsync进程……..我必须使用Windows任务管理器手动将其杀死。

是否有可能OutputStream在我打电话之前以某种方式获取该进程的信息并发送ctrl-c destroy();

如果有人对解决方法有任何想法,那就太好了。感谢:D

关于如何在Windows中的ProcessBuilder Java中设置PATH环境变量java环境变量path怎么设置的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于0 Linux下Java使用ProcessBuilder执行命令与直接Bash执行命令之间的不同(环境变量方面)、1.4.2 设置PATH环境变量、golang 在windows中设置环境变量的操作、Java ProcessBuilder process.destroy()不会杀死WinXP中的子进程的相关知识,请在本站寻找。

本文标签: