Копирование DLL из WAR приводит к тому, что LF становятся CRLF - PullRequest
1 голос
/ 02 сентября 2010

Я использую собственный интерфейс Java для включения статически скомпилированного кода в мое приложение Java. В частности, у меня есть файл DLL с скомпилированным кодом в WAR, который содержит мое приложение.

К сожалению, загрузчик классов не может загрузить DLL изнутри WAR (из предварительного исследования ... если это не так, обязательно сообщите мне!). Поэтому я должен скопировать DLL во временную папку, а затем загрузить ее оттуда.

Но когда я пытаюсь загрузить скопированную DLL, я получаю java.lang.UnsatisfiedLinkError: C:\path\to\dll\VIX.dll: %1 is not a valid Win32 application. Размеры файлов выглядят одинаково (оба 401K, согласно Windows), но это просто не работает. Вот код, который выполняет копирование:

InputStream ReadDLL = Thread.currentThread().getContextClassLoader().getResourceAsStream("/VIX.dll");

File file = new File(workDir, "VIX.dll");
OutputStream WriteDLL = null;
try {
    WriteDLL = new FileOutputStream(file);
} catch (FileNotFoundException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

byte[] buffer = new byte[1024];
int numchars;
try {
    while((numchars = ReadDLL.read(buffer)) > 0) {
        WriteDLL.write(buffer, 0, numchars);
    }
    ReadDLL.close();
    WriteDLL.close();
} catch (IOException e) {
    e.printStackTrace();
}

Сравнивая оригинальную и скопированную версии DLL, я обнаружил, что каждый экземпляр байта 0x0A (символ перевода строки ASCII) в оригинале заменяется двумя байтами: 0x0D0A (CRLF ASCII). Конечно, это DLL, 0x0A - это не на самом деле перевод строки, а просто двоичный код операции. Но по какой-то причине Java настаивает на том, чтобы сделать этот полезный перевод для меня.

Наконец, ReadDLL InputStream получается путем вызова Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);, где, очевидно, fileName - это имя моего файла.

1 Ответ

0 голосов
/ 02 сентября 2010

Две гипотезы:

  1. Возможно, DLL была изменена при передаче FTP с UNIX на Windows с использованием режима ASCII по умолчанию (используйте режим bin для передачи по FTP).
  2. Возможно, DLL рассматривалась как ASCII-файл в системе контроля версий и была извлечена в системе Windows.

Попробуйте разархивировать WAR и посмотреть, является ли это оригинальной или модифицированной версией.

Я не вижу ни одного случая, чтобы Java или сервер веб-приложений выполняли это преобразование у вас за спиной.

...