Как найти 32-битный jvm.dll из командного файла - PullRequest
0 голосов
/ 04 ноября 2011

У меня есть приложение Java, которое я настраиваю в качестве службы Windows, используя Procrun .Это приложение должно использовать 32-разрядную версию Java из-за одной из сторонних библиотек, используемых в приложении.Я пытаюсь написать пакетный скрипт для пользователей, чтобы иметь возможность установить службу, аналогично service.bat в каталоге tomcat bin.

Procrun использует параметр --Jvm при установке службы.Этот параметр может быть установлен на auto или вы можете указать полный путь к jvm.dll.Мне нужно найти способ проверить, установлена ​​ли 32-разрядная версия Java и где находится jvm.dll.

Как найти 32-разрядную версию jvm.dll из командного файла?

Я видел похожие вопросы, в которых говорится, что нужно использовать java -version, чтобы увидеть, является ли она 32-битной или 64-битной, но только потому, что текущая версия java является 64-битной, это не значит, что они также не имеют32-разрядная версия установлена.

Спасибо

Ответы [ 3 ]

1 голос
/ 05 ноября 2011

я не думаю, что это требует комплексного решения,

просто проверьте общие пути для jvm,

если это в "c: \ Program Files (x86) \", то это 32-битная версия. если он находится в "c: \ Program Files", то его 64 бита.

Вы также можете запросить regkeys, переменные окружения или сам файл с помощью какого-либо стороннего инструмента. или даже запустить поиск по всей системе. но сначала попробуйте простое решение, возможно, оно работает.

если вам нужна помощь с другими способами, просто опубликуйте ее здесь:)

1 голос
/ 05 ноября 2011

Если возможно, я бы выбрал простое решение (т. Е. Угадывание двоичного типа на основе каталога установки). Если в большинстве случаев это неправильно, вы можете перечислить местоположения библиотеки времени выполнения из реестра, а затем проверить PE-заголовки найденного файла jvm.dll.

Ниже приведен пример реализации в 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 $_}}
}
1 голос
/ 04 ноября 2011

Возможно, это не тот ответ, который вам нужен.Но, учитывая, что вы хотите использовать JVM определенного типа, не лучше ли включить его в свое программное обеспечение и запустить его?В противном случае это кажется чем-то действительно сложным из пакетного файла, поскольку JVM может быть установлена ​​где угодно, и обход всех файлов, вероятно, не оптимален.Возможно, вам удастся сделать это с помощью Powershell, но тогда не у всех это установлено.

...