API сплава, приводящий к java.lang.UnsatisfiedLinkError
В настоящее время я использую API Alloy Analyzer для создания программы и получаю некоторые специфические действия. В частности, если я открою файл и проанализирую его (используя CompUtil.parseEverything), затем создаю новую команду и вызываю TranslateAlloyToKodkod.execute_command для проанализированного файла и вновь созданную команду, используя MiniSat с ядром UNSAT, он работает нормально. Однако позже во время выполнения моя программа анализирует второй входной файл (также используя CompUtil.parseEverything), получает другой мир, создает новую команду, а затем я снова пытаюсь вызвать TranslateAlloyToKodkod.execute_command и выдает следующую ошибку:
ERROR: class edu.mit.csail.sdg.alloy4.ErrorFatal: The required JNI library cannot be found:
java.lang.UnsatisfiedLinkError: no minisatproverx5 in java.library.path
edu.mit.csail.sdg.alloy4compiler.translator.TranslateAlloyToKodkod.execute_command(TranslateAlloyToKodkod.java:390)
У кого-нибудь есть идеи, почему это выбрасывается второй раз, а не первый?
Подводя итог, у меня есть нечто похожее на следующее:
Module someWorld = CompUtil.parseEverything_fromFile(rep, null, "someFile.als");
//For the following, "sig" is a sig in someWorld.getAllReachableSigs();
Command command = sig.not();
A4Options options = new A4Options();
options.solver = A4Options.SatSolver.MiniSatProverJNI;
A4Solution ans =
TranslateAlloyToKodkod.execute_command(rep, someWorld, command, options);
//No thrown error
Module someOtherWorld = CompUtil.parseEverything_fromFile(rep, null, "someOtherFile.als");
//For the following, "sig" is a sig in someOtherWorld.getAllReachableSigs();
Command commandTwo = sig.not();
A4Solution ansTwo =
TranslateAlloyToKodkod.execute_command(rep, someOtherWorld, commandTwo, options);
//Thrown error above. Why?
2 ответа
Я пытался воспроизвести это поведение, но не смог. Если я не добавлю двоичные файлы MiniSat в переменную среды LD_LIBRARY_PATH, я получу исключение, которое вы упомянули в первый раз, когда я вызываю execute_command
, После настройки LD_LIBRARY_PATH исключение не происходит.
Чтобы настроить LD_LIBRARY_PATH:
(1) если вы используете Eclipse, вы можете щелкнуть правой кнопкой мыши одну из ваших исходных папок, выбрать "Build Path" -> "Configure Build Path", а затем на вкладке "Source" убедиться, что "Native library location" указывает на папку, в которой MiniSat бинарные файлы находятся.
(2) при запуске из оболочки просто добавьте путь к папке с двоичными файлами MiniSat в LD_LIBRARY_PATH, например, что-то вроде export LD_LIBARRY_PATH=alloy/extra/x86-linux:$LD_LIBRARY_PATH
,
Вот точный код, который я запускал, и все работало
public static void main(String[] args) throws Exception {
A4Reporter rep = new A4Reporter();
A4Options options = new A4Options();
options.solver = A4Options.SatSolver.MiniSatProverJNI;
Module someWorld = CompUtil.parseEverything_fromFile(rep, null, "someFile.als");
Command command = someWorld.getAllCommands().get(0);
A4Solution ans = TranslateAlloyToKodkod.execute_command(rep, someWorld.getAllReachableSigs(), command, options);
System.out.println(ans);
Module someOtherWorld = CompUtil.parseEverything_fromFile(rep, null, "someOtherFile.als");
Command commandTwo = someOtherWorld.getAllCommands().get(0);
A4Solution ansTwo = TranslateAlloyToKodkod.execute_command(rep, someOtherWorld.getAllReachableSigs(), commandTwo, options);
System.out.println(ansTwo);
}
с "someFile.als" быть
sig A {}
run { some A } for 4
и "someOtherFile.als"
sig A {}
run { no A } for 4
Я использую loy4.2.jar в качестве библиотеки в своем проекте плагина eclipse.
A4Reporter rep = new A4Reporter();
Module world = CompUtil.parseEverything_fromFile(rep, null, "civi.als");
A4Options options = new A4Options();
options.solver = A4Options.SatSolver.SAT4J;
options.skolemDepth = 1;
Когда я использую SAT4J, решатель по умолчанию, упомянутая здесь проблема не будет отображаться. Но выходит еще одно исключение. Причина в том, что моему файлу civi.als нужна модель Integer, которая находится в loy4.2.jar в папке / models / util /. Но когда я запускаю приложение, оно пытается найти файл util / Integer.als напрямую. Это вызывает исключение. Можно ли исправить эту проблему?
Кроме того, я также попытался поместить в каталог плагинов eclipse объект loy4.2.jar и запустить свое приложение как приложение eclipse (запустив свое приложение как плагин). С решателем по умолчанию у приложения вообще нет проблем. Но когда я переключаюсь на MiniSatProverJNI, проблема, упомянутая здесь, выходит (я установил сплава 4,2.jar как classpath).