У меня очень странная проблема. Я сделал некоторые очень сумасшедшие вещи: я превратил жир uber-jar библиотек hadoop, которые я собрал с плагином sbt-assembly для DLL с использованием IKVM. Я написал небольшую тестовую программу, которая просто сводится к следующему:.net: загрузка зависимостей для библиотек DLL, отличных от EXE?
var u = new java.net.URI("hdfs://my-namenode:8020/");
var fs = org.apache.hadoop.fs.FileSystem.get(u, new org.apache.hadoop.conf.Configuration());
foreach(var s in fs.listStatus(new org.apache.hadoop.fs.Path("/"))) {
Console.WriteLine(s.getPath().toString());
}
Когда я запускаю это в консольном приложении с моей hadoop.dll и необходимыми библиотеками DLL IKVM добавлен как ссылки, это перечисляет содержание моего HDFS ,
Однако, когда я оберните именно этот код в DLL, добавьте ту же зависимость в эту DLL и вызвать это от моего консольного приложения, я получаю:
No FileSystem for scheme: hdfs
Когда я указать правильное имя класса в моем Hadoop conf через ключ fs.hdfs.impl
, я получаю ClassNotFoundException
.
Являются ли зависимости в разных исполняемых файлах по-разному, чем в DLL, или это может быть специфическое поведение IKVM?
EDIT: Другое странное поведение: когда я конструирую FileSystem
один раз в своем консольном приложении, а THEN вызывает этот метод в DLL, он запускается.