2011-11-04 41 views
0

我有一個java應用程序,我使用Procrun將其設置爲Windows服務。由於應用程序中使用了第三方庫之一,此應用程序需要使用32位版本的Java。我正在嘗試爲用戶編寫批處理腳本,以便能夠安裝服務,類似於tomcat bin目錄中的service.bat如何從批處理文件中找到32位jvm.dll

安裝服務時,Procrun使用--Jvm參數。該參數可以設置爲auto,也可以指定jvm.dll的完整路徑。我需要找到一種方法來查看是否安裝了32位java以及jvm.dll的位置。

如何從批處理文件中找到32位jvm.dll?

我見過類似的問題,說使用java -version來查看它的32位或64位,但僅僅因爲當前版本的Java是64位,並不意味着他們不也有32位安裝。

謝謝

回答

1

這可能不是你想要的答案。但是鑑於你需要特定類型的JVM,將它與你的軟件包含在一起並運行它不是更好嗎?否則,這似乎很難從批處理文件中完成,因爲JVM可能安裝在任何地方,並且爬遍所有文件可能不是最佳選擇。您可能可以使用Powershell,但是,不是每個人都安裝了。

1

我不認爲這需要一個複雜的解決方案,

只是檢查JVM的共同路徑,

如果在 「C:\ Program Files文件(x86)的\」,那麼其32 bit版本。 如果它在「c:\ Program Files」中則是它的64位。

您還可以使用某些第三方工具查詢重新生成密鑰,環境變量或文件本身。 甚至在整個系統上運行搜索。 但首先嚐試簡單的解決方案,也許它工作。

,如果你需要用其他方式幫助解決這個只是張貼在這裏:)

1

如果可能的話我會去簡單的解決方案(即基於安裝目錄猜測二進制類型)。如果大部分時間都不正確,可以從註冊表中枚舉runtimelib位置,然後檢查您找到的jvm.dll的PE頭。

下面是Powershell中的一個示例實現。

# Determine the machinetype of an executable 

function Get-BinaryType { 
param ($filename) 

$PE_POINTER_OFFSET = 60;    
$MACHINE_OFFSET = 4; 
$data = get-content $filename -encoding byte -totalcount 4096 
$pe_header_addr = [BitConverter]::ToInt32($data, $PE_POINTER_OFFSET) 
$machineUint = [BitConverter]::ToUint16($data, $pe_header_addr + $MACHINE_OFFSET) 

$machineType = @{0 = "Native"; 0x014c = "I386"; 0x0200 = "Itanium"; 0x8664 = "x64"} 
$machineType.Get_Item([int]$machineUint) 

} 

# Look for the value of the RuntimeLib value found under the JavaSoft registry 
# keys and determine the binarytype of the file found under this value. 

$registrykeys = "HKLM:\software\Wow6432Node\JavaSoft", "HKLM:\software\JavaSoft" 
$registrykeys | Where-Object {test-path $_} | % { 

    dir $_ -rec -ea SilentlyContinue | 
     ForEach-Object { 
     (get-itemproperty -Path $_.PsPath).RuntimeLib 

    } | 
    select -Unique | 
    select @{N="Name";E={$_}}, @{N="BinaryType";E={Get-BinaryType $_}} 
} 
相關問題