Подтвердить что ты не робот

Используйте банку в JavaScript через Java ScriptEngine

Мне нужно использовать классы из jar файла внутри JavaScript. Я использую JavaScript через Java ScriptEngine и хотел бы сделать что-то похожее на то, что я сделал с Jython здесь,

    import org.python.core.Py;
    import org.python.core.PySystemState;
    ...
    PySystemState engineSys = new PySystemState();
    engineSys.path.append(Py.newString("C:/GMSEC_API/bin/gmsecapi.jar"));
    Py.setSystemState(engineSys);
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("python");

Когда я делаю это с Jython, он отлично работает, и файлы python могут использовать классы api, находящиеся внутри файла jar.

4b9b3361

Ответ 1

Я могу использовать классы jar внутри JavaScript таким образом, но вам нужно установить jar в путь к классу, когда вы его запускаете. Я был после решения, подобного Jython/Python, где вы можете установить jar внутри Java, но я просто собираюсь создавать пакетные файлы и sh файлы и устанавливать его таким образом (теперь это проще сделать). Вот мое решение, которое работает для меня.

Для компиляции Затем выполните:

    cd C:\your\directory\folder\with\the\javascript\and\java\files

    javac -d . ClassSpy.java FileSearch.java HelloWorld.java Main.java Parameters.java Run.java

    java -cp ./;C:\ABCAPI\bin\abcapi.jar hammer.main.Main gui=true input=JavaScriptStatus.js

Комментарии к приведенным выше строкам:

  • при компиляции вы можете использовать -d ., если у вас есть ваши java файлы в качестве пакетов, которые вы определили, и он поместит их в папки с вашим именем пакета. Если это не ясно, просто проверьте этот пост (я ухожу от задачи) Как скомпилировать пакеты в java?.

  • Еще одно замечание: когда я его запускал, я добавил две вещи в мой путь к классу. -cp означает путь к классу, и все, что после этого будет добавлено к вашему пути класса для этого текущего прогона. Вы можете разделить их точкой с запятой. ./ добавляет текущий каталог к ​​пути к классу, а остальное я добавил после того, как это было местонахождение файла jar API, в котором я нуждался.

  • hammer.main - это расположение пакета класса Main, который является классом, содержащим мою основную функцию для запуска программы.

  • Два аргумента после этого относятся к моей программе, и вы можете увидеть файл JavaScript, в котором я расскажу Java ScriptEngine, чтобы читать и выполнять.

Использовать файл Jar внутри JavaScript:

Теперь, когда файл jar находится на пути к классу и видимый, мы можем получить пакет из этого файла jar, а затем вызвать классы из пакета. Итак, пример ниже abc.foo.pack.name - это пакет внутри abcapi.jar, и два класса, которые я использую ClassFromTheJarFile и AnotherClassFromTheJarFile, находятся в этом пакете. Я использую метод установки пакета в переменную, а затем префикс классов, которые я хочу использовать с переменной, содержащей пакет. Другой способ сказать importPackage(com.foo.bar), тогда вам не обязательно будет префикс классов каждый раз, когда вы их создаете, но эта техника не работает для меня по какой-то причине (возможно, я сделал что-то неправильно). Во всяком случае, следующий код работает отлично для меня,

    myvariable = Packages.abc.foo.pack.name;

    var foo = new myvariable.ClassFromTheJarFile("arg1","arg2");

    foo.doSomething();

    var fooSister = new myvariable.AnotherCLassFromTheJarFile("arg1");

    fooSister.doSomthingFromThisClass();

Вывод:

Оказывается, моя ошибка заключалась в том, чтобы импортировать класс прямо так,

    myvariable = Packages.abc.foo.pack.name.ClassFromTheJarFile;

Затем я попытался использовать его, например,

    var foo = new myvariable.ClassFromTheJarFile("arg1","arg2");

Что не работает.

Надеюсь, это помогает кому-то, потому что я получаю много замечаний вроде "Вы знаете, что Java и JavaScript - это две разные вещи". Ну да, я знаю это, какова ваша мысль?

Keep In Mind:

Я не использую это в браузере или через Интернет. Я использую это через Java ScriptEngine. Если вам нужно получить файл jar из URL-адреса, эта найденная мной ссылка может помочь вам http://mozilla-firefox-extension-dev.blogspot.com/2004/11/calling-java-code-in-custom-jars-from.html