Как загрузить собственные библиотеки по длинному пути?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" при копировании в глубоко вложенный каталог загружается нормально. Таким образом, поведение зависит от библиотеки! Вот мой тестовый сценарий (остерегайтесь обработки ошибок Powershell по умолчанию):

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

$o='C:\Windows\System32\cabapi.dll'
$d='C:\q72\' + $( $("long_" * 10 + "\") * 10)
$ef=$o -replace '\\','\\'
"System.load(`"$ef`")" | jshell -s -
$f=$d+'\test.dll'
New-Item -ItemType Directory -Path $d -Force
Copy-Item $o $f
$ef=$f -replace '\\','\\'
"System.load(`"$ef`")" | jshell -s -
Remove-Item 'C:\q72' -Recurse
Как загрузить собственную библиотеку по глубоко вложенному длинному пути?
В чем разница между msvcp140.dll и cabapi.dll?


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

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

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

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

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

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