Я могу загружать собственные библиотеки по короткому пути к файлу:
Код: Выделить всё
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 ничего не меняет даже после перезагрузки
- Определение переменной среды PATH, указывающей на длинный путь к каталогу, и использование System.loadLibrary() с коротким именем.
- Использование Java 25 - допускается короткие расширенные пути, но не работают на длинных.
- Принуждение к сокращению путей путем обрезки одного или двух символов из некоторых имен каталогов на данный момент работает, но этот подход достигает своих пределов.
- Символическое связывание файлов во временный каталог, поскольку этот подход весьма подвержен ошибкам (из-за очистки, которая смехотворно сложна в Windows с его политика удаления открытых файлов).
Вот тестовый сценарий (прочитайте выходные данные, чтобы определить, где произошла ошибка, 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
Мобильная версия