最近在做一個項目的時候,遇到一個要在java程序中改變linux的PATH環境變數的問題。我們知道在linux中PATH環境變數保存在用戶根目錄下的「.bashrc」和「.bash_profile這兩個隱藏文件中。用戶登錄的過程中便會把這兩個文件中的PATH路徑記錄的該用戶的shell中。如果用戶已經登錄,這時可通過命令 export PATH=add_path:$PATH來增加一個路徑為add_path的路徑。但通過此種方式增加的PATH路徑只在當前shell中有效(也就是說,當用戶通過另一個shell登錄時,PATH又變成了原來的值)。在windows中用戶已經登錄的情況下則是通過命令set來更改環境變數的。
Java語言是一門跨平台的語言,具有一次編寫到處運行的特點。在java的1.0版本中有System.getenv(String key)可以來取得操作系統的環境變數,但由於getenv()具有與操作系統緊密相關的特性,這與java的跨平台的跟本特徵相沖突,所以在java1.2中該方法被不推薦使用。而程序員在編程的過程中經常需要用到getenv(),所以在java1.5中getenv()又重新回來了。雖然可以通過getenv()來取得系統的環境變數,但是卻沒有與getenv()相對應的setenv()函數來改變系統的環境變數。
C語言是一門與平台相關的語言,在多年的發展中積累了數量相當可觀的庫函數,在stdlib.h函數庫中就有getenv(參數省略)與setenv(參數省略)來獲取和改變系統的環境變數,這就給我們一個提示:能不能在java語言中調用C語言的函數庫?JNI(java本地介面)正給了我們這樣一個選擇。
1.首先生成ChangeEnv.java文件
/**
* @author sgh
* @version 1.0.0 06/07/21
*/
public class ChangeEnv {
/**
* @param args
*/
static {
try{
System.loadLibrary("change_env");//聲明欲載入的動態鏈接庫
}
catch(UnsatisfiedLinkError e ){
System.err.println("Can not load library "+e.toString());
}
}
public native void setEnv(String name ,String value, int replace);//聲明一個本地調用介面
}
說明:
1. 動態鏈接庫在windows中是.dll文件,在linux中則是.so文件,但在System.loadLibrary("change_env")中不需要把後綴寫出 ,程序會自己判斷。
2. 本地介面聲明方式為在普通函數前加native關鍵字
2. 編譯java文件 :Javac ChangeEnv.java
3. 使用命令 javah ChangeEnv 生成ChangeEnv.h文件(ChangeEnv.h文件由程序自動生成,程序員不需要作任何改動)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class ChangeEnv */
#ifndef _Included_ChangeEnv
#define _Included_ChangeEnv
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: ChangeEnv
* Method: setEnv
* Signature: (Ljava/lang/String;Ljava/lang/String;I)V
*/
JNIEXPORT void JNICALL Java_ChangeEnv_setEnv
(JNIEnv *, jobject, jstring, jstring, jint);
#ifdef __cplusplus
}
#endif
#endif
說明:
1.JNIEXPORT void JNICALL Java_ChangeEnv_setEnv
(JNIEnv *, jobject, jstring, jstring, jint)是本地介面函數的聲明需要在.cpp文件中實現它
4.編寫ChangeEnv.cpp
#include"ChangeEnv.h"
#include<stdio.h>
#include<stdlib.h>
//與ChangeEnv.h中函數聲明相同
JNIEXPORT void JNICALL Java_ChangeEnv_setEnv(JNIEnv * env, jobject obj, jstring name, jstring value, jint replace)
{
////從instring字元串取得指向字元串UTF編碼的指針
const char * name_char =(const char *) env->GetStringUTFChars(name ,JNI_FALSE);
const char * value_char =(const char *) env->GetStringUTFChars(value ,JNI_FALSE);
//實際調用的C庫函數
setenv(name_char,value_char,replace);
//通知虛擬機本地代碼不再需要通過name_char訪問Java字元串,否則會
//造成內存泄露
env->ReleaseStringUTFChars(name,(const char *)name_char);
env->ReleaseStringUTFChars(value,(const char *)value_char);
return ;
}
5.編譯ChangeEnv.cpp文件,生成libchange_env.so文件
gcc -I/home/disk4/sgh/sgh/jrockit/include -I/home/disk4/sgh/sgh/jrockit/include/linux -shared -o libchange_env.so ChangeEnv.cpp
說明:
1. Linux下鏈接庫名稱必須以lib開頭,否則會無法識別
6. 編寫測試程序test.java
import java.io.InputStreamReader;
import java.io.LineNumberReader;
public class test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(System.getenv("PATH"));//列印改變之前的PATH路徑
String pathPer = System.getProperty("java.library.path");
pathPer+=":.";
System.setProperty("java.library.path",pathPer);//把當前目錄加到動態鏈接庫路徑中
ChangeEnv changePath = new ChangeEnv ();//生成一個ChangeEnv對象
changePath.setEnv("PATH","$PATH:/home/disk4/sgh/sgh/soft/slurm34/bin:/home/disk4/sgh/sgh/soft/slurm34/sbin",1);
System.out.println(System.getenv("PATH"));//列印改變之後的PATH路徑
}
}
說明:
1. 可以看到PATH路徑發生了變化
JNI在windows下的使用
既然所有的.h ,.cpp文件都已寫好,我們不防順便編譯以下windows下的動態鏈接庫.dll文件。
這時我們發現在windows下的vc環境中沒有setenv(char * name ,char * value ,int replace),而只有putenv(char * key_value)函數,所以我們必須重寫ChangeEnv.cpp,為了使ChangeEnv.class對外介面保持一致性,所以我們沒有改寫ChangeEnv.java中本地函數借口的聲明。
1. 重寫ChangeEnv.cpp函數
#include"ChangeEnv.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//與ChangeEnv.h中函數聲明相同
JNIEXPORT void JNICALL Java_ChangeEnv_setEnv(JNIEnv * env, jobject obj, jstring name, jstring value, jint replace)
{
if(replace==0)//如果replace==0表示不發生置換,直接退出
return ;
////從instring字元串取得指向字元串UTF編碼的指針
const char * name_char =(const char *) env->GetStringUTFChars(name ,JNI_FALSE);
const char * value_char =(const char *) env->GetStringUTFChars(value ,JNI_FALSE);
//實際調用的C庫函數,把環境變數寫成key=value格式
char * key_value=(char *)name_char;
strcat(key_value, "=");
strcat(key_value, value_char);
putenv(key_value);
//通知虛擬機本地代碼不再需要通過name_char訪問Java字元串,否則會
//造成內存泄露
env->ReleaseStringUTFChars(name,(const char *)name_char);
env->ReleaseStringUTFChars(value,(const char *)value_char);
return ;
}
2. 在vc6中新建一個動態鏈接庫工程,添加ChangeEnv.h和ChangeEnv.cpp到該工程中去
3. 在「工具」----〉「選項-」----〉「目錄」中添加java的include路徑
C:\Program Files\Java\jdk1.5.0_06\include和C:\Program Files\Java\jdk1.5.0_06\include\win32
4. 單擊「運行」,把生成的change_env.dll拷貝到ChangeEnv.java所在的工程目錄中
5. 在ChangeEnv.java所在工程中新建一個測試程序test.java
import java.io.InputStreamReader;
import java.io.LineNumberReader;
public class test {
/**
* @param args
*/
public static void main(String[] args) {
ChangeEnv changePath = new ChangeEnv();
changePath.setEnv("PATH", "%PATH%;c:\\", 1);
System.out.println(System.getenv("PATH"));
}
}
轉載
❷ win10怎樣更改java的環境變數
我的電腦點右鍵,選擇「屬性」,選擇「高級」標簽,進入環境變數設置,分別設置如下三個環境變數: 設置JAVA_HOME: 一是為了方便引用,比如,JDK安裝在C:\jdk1.6.0目錄里,則設置JAVA_HOME為該目錄路徑, 那麼以後要使用這個路徑的時候, 只需輸入%JAVA_HOME%即可, 避免每次引用都輸入很長的路徑串; 二則是歸一原則, 當JDK路徑改變的時候, 僅需更改JAVA_HOME的變數值即可, 否則,就要更改任何用絕對路徑引用JDK目錄的文檔, 要是萬一沒有改全, 某個程序找不到JDK, 後果是可想而知的----系統崩潰! 三則是第三方軟體會引用約定好的JAVA_HOME變數, 不然, 你不能正常使用該軟體. 在系統環境變數那一欄中點->新建JAVA_HOME (JAVA_HOME指向的是JDK的安裝路徑) 變數名: JAVA_HOME 變數值: C:\jdk1.6.0 (1)設置好path變數,使得我們能夠在系統中的任何地方運行java應用程序,比如javac、java、javah等等,這就要找到我們安裝JDK的目錄, 假設我們的JDK安裝在C:\jdk1.6.0目錄下,那麼在C: \jdk1.6.0\bin目錄下就是我們常用的java應用程序,我們就需要把C:\jdk1.6.0\bin這個目錄加到path環境變數裡面。 在系統變數里找到path變數,選擇->編輯;(裡面已經有很多的變數值,是在變數值的最前面加上C:\jdk1.6.0\bin; 如果沒有 就新建一個 但是 一般都會有的) 變數名: path 變數值: C:\jdk1.6.0\bin; 或 %JAVA_HOME%\bin; (2)classpath環境變數,是當我們在開發java程序時需要引用別人寫好的類時,要讓java解釋器知道到哪裡去找這個類。通常,sun為我們提供了一些額外的豐富的類包,一個是dt.jar,一個是tools.jar,這兩個jar包都位於C:\jdk1.6.0\lib目錄下,所以通常我們都會把這兩個jar包加到我們的classpath環境變數中set classpath=.;C:\jdk1.6.0\lib\tools.jar;C:\jdk1.6.0\lib\dt.jar。 在系統環境變數那一欄中點->新建classpath 變數名: classpath 變數值: .;C:\jdk1.6.0\lib\tools.jar;C:\jdk1.6.0\lib\dt.jar; 或 .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar; (注意,CLASSPATH 中最前面是有個 「.」的,表示當前目錄,這樣當我們運行java AClass的時候,系統就會先在當前目錄尋找AClass文件了。)
❸ 濡備綍鍦╦ava紼嬪簭璁劇疆鐜澧冨彉閲
鐜澧冨彉閲忔槸涓涓鍏鋒湁鐗瑰畾鍚嶅瓧鐨勫硅薄錛屽畠鍖呭惈浜嗕竴涓鎴栬呭氫釜搴旂敤紼嬪簭鎵灝嗕嬌鐢ㄥ埌鐨勪俊鎮銆備緥濡俻ath錛屽綋瑕佹眰緋葷粺榪愯屼竴涓紼嬪簭鑰屾病鏈夊憡璇夊畠紼嬪簭鎵鍦ㄧ殑瀹屾暣璺寰勬椂錛岀郴緇熼櫎浜嗗湪褰撳墠鐩褰曚笅闈㈠繪壘姝ょ▼搴忓栵紝榪樺簲鍒皃ath涓鎸囧畾鐨勮礬寰勫幓鎵俱傜敤鎴烽氳繃璁劇疆鐜澧冨彉閲忥紝鏉ユ洿濂界殑榪愯岃繘紼嬨
宸ュ叿錛
鐜澧冨彉閲
JDK
鏂規硶錛
1銆侀栧厛涓嬭澆瀹夎匤DK瀹夎呭寘錛屽畨瑁呰繃紼嬩腑娉ㄦ剰瀹夎呭埌鍏朵粬鐩橈紝涓嶈佸畨瑁呭埌C鐩樺氨濂斤紱
❹ WIN7怎麼配置環境變數JAVAHOME
工具:window7系統上抄安裝好java
步驟:
打開indow7系統電腦,用滑鼠右擊「我的電腦」->屬性 ,選擇左邊導航的「高級系統設置」選項,選擇右下角的「環境變數」選項。