Как загрузить собственные библиотеки по длинному пути?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как загрузить собственные библиотеки по длинному пути?

Сообщение Anonymous »

Мое Java-приложение установлено в «тестовую область» другого приложения, в результате чего абсолютные пути к файлам длиннее, чем обычно.
Я могу загружать собственные библиотеки по короткому пути к файлу:

Код: Выделить всё

System.load("C:\\msvcp140.dll") // works
Но не по расширенному пути к файлу:

Код: Выделить всё

System.load("\\\\?\\C:\\msvcp140.dll") // Exception:
|  Exception java.lang.UnsatisfiedLinkError: Can't load library: \\?\C:\msvcp140.dll
|        at ClassLoader.loadLibrary (ClassLoader.java:2398)
|        at Runtime.load0 (Runtime.java:755)
|        at System.load (System.java:1957)
|        at (#1:1)
ни с очень длинного пути:

Код: Выделить всё

Exception java.lang.UnsatisfiedLinkError: C:\q72\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_lon
g_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_long_long_long_long_\long_long_long_long_long_long_lon
g_long_long_long_\long_long_long_long_long_long_long_long_long_long_\msvcp140.dll: The filename or extension is too long
Я пробовал:
  • Взлом реестра:

    Код: Выделить всё

    Windows Registry Editor Version 5.00
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
    "LongPathsEnabled"=dword:00000001
    
  • Групповая политика\Политика локального компьютера\Конфигурация компьютера\Административные шаблоны\Система\Файловая система\Включить длинные пути Win32
Кажется, ни то, ни другое не помогает. Даже после перезагрузки.
Я еще не пробовал:
  • Символическое связывание файлов во временный каталог, так как этот подход весьма подвержен ошибкам (из-за очистки, которая смехотворно сложна в Windows с ее политикой удаления открытых файлов).
  • Определение переменной среды PATH и использование System.loadLibrary(), потому что ChatGPT заявил, что не решит внутренние проблемы Проблема с API. Это сработает для меня, потому что, хотя путь установки является динамическим, я имею полный контроль над запуском приложения и могу переопределить среду.
На данный момент я сокращаю пути, удаляя один или два символа из некоторых имен каталогов, но этот подход выходит за рамки своих возможностей.
Я заметил, что C:\Windows\System32\cabapi.dll и C:\Program Файлы\Google\Chrome\Application\145.0.7632.45\libEGL.dll загружаются нормально при копировании в глубоко вложенный каталог. Но C:\Program Files\Google\Chrome\Application\145.0.7632.45\dxil.dll этого не делает. Таким образом, поведение зависит от библиотеки!
Вот тестовый сценарий (прочитайте выходные данные, чтобы определить, где произошла ошибка, jshell всегда возвращает нулевой код выхода):

Код: Выделить всё

function loadFromPath {
param (
[Parameter(Mandatory=$true)]
[System.IO.FileInfo]$origin,
[Parameter(Mandatory=$true)]
[string]$target
)
$null = New-Item -ItemType Directory -Path ($target | Split-Path)  -Force
Copy-Item $origin $target
$escaped = $target.Replace('\', '\\')
$javaBlock = @"
var lib = "\\\\?\\$escaped";
System.out.println("Loading " + lib);
System.load(lib);
"@
Write-Host $origin
$javaBlock | jshell -s -
}
$root = 'C:\longTest\'

function loadShortAndLong {
param (
[Parameter(Mandatory=$true)]
[System.IO.FileInfo]$origin
)
$longPath=$root + $( $("long_" * 10 + "\") * 10)  + 'test.dll'
$shortPath=$root + 'test.dll'
loadFromPath $origin $shortPath
loadFromPath $origin $longPath
}
loadShortAndLong 'C:\Program Files\Google\Chrome\Application\145.0.7632.45\libEGL.dll'
loadShortAndLong 'C:\Program Files\Google\Chrome\Application\145.0.7632.45\dxil.dll'
Remove-Item $root -Recurse -Force
Как загрузить собственную библиотеку по глубоко вложенному длинному пути?
В чем разница между dxil.dll и libEGL.dll?


Подробнее здесь: https://stackoverflow.com/questions/798 ... -long-path
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»