2011-11-04 3 views
0

Procrun을 사용하여 Windows 서비스로 설정하는 Java 응용 프로그램이 있습니다. 이 앱은 앱에 사용되는 타사 라이브러리 중 하나 때문에 32 비트 버전의 Java를 사용해야합니다. 사용자가 서비스를 설치할 수 있도록 배치 스크립트를 작성하려고하는데, 이는 tomcat bin 디렉토리에 service.bat과 비슷합니다.배치 파일에서 32 비트 jvm.dll을 찾는 방법

Procrun은 서비스를 설치할 때 - Jvm 매개 변수를 사용합니다. 이 매개 변수는 auto로 설정되거나 jvm.dll의 전체 경로를 지정할 수 있습니다. 나는 32 비트 자바가 설치되어 있는지, 그 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 비트가있는 경우.

일부 타사 도구를 사용하여 regkeys, 환경 변수 또는 파일 자체를 쿼리 할 수도 있습니다. 또는 전체 시스템에서 검색을 실행하십시오. 하지만 먼저 간단한 해결책을 시도해보십시오. 어쩌면 작동 할 수도 있습니다.

당신은 여기에 게시이 문제를 해결하기 위해 다른 방법으로 도움이 :)

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 $_}} 
} 
관련 문제