Запуск функции Java с веб-страницы?

Итак, мой друг продолжает делать запросы об этом плагине, который я пишу для Bukkit, и, как порядочный человек, я принимаю их. К сожалению, я не настолько великий программист. Я делаю страницу справки для этого плагина — локальный файл, который поставляется с плагином — и мне нужно знать, как я могу запустить файл .jar плагина. У меня есть основной класс, и я планирую сделать что-то подобное как часть тегов <head></head>.

<script> <!--
if(confirm("Would you like to run the plugin to set up first? (Click cancel if you do not)")) {
    //Something to run the plugin .jar file
}
//-->
</script>

Будет ли это работать? Если мне нужно внести какие-либо изменения, просто дайте мне знать. Я думаю, что могу вызывать только функции, и в этом случае я просто вызову main().
ПРИМЕЧАНИЕ. Это работает как есть, я просто создаю другое всплывающее окно вместо запуска файла .jar. ПРИМЕЧАНИЕ. И веб-страница, и jar-файл уже загружены на компьютер пользователя, мне просто нужно иметь возможность запустить его.
ПРИМЕЧАНИЕ. Эта веб-страница буквально представляет собой файл HTML, который загружается на их компьютер при загрузке плагина. и я хочу, чтобы он запускал мой плагин, потому что это функция автоматической настройки. Сайт НЕ размещен на сервере. Я чувствую, что мне ДЕЙСТВИТЕЛЬНО нужно прояснить это.

Просмотрел код и решил, что ссылка будет проще и лучше всего для моих целей - Спасибо за помощь! (Кстати, получилось так, что я бы файлом .jar распаковал документ справки в папку. Ну да ладно :P)


person Fund Monica's Lawsuit    schedule 04.12.2012    source источник
comment
Опустите бит else {} --- Кроме того, вы не можете запускать файлы .jar напрямую из JavaScript. Представьте себе проблемы безопасности с этим.   -  person Cerbrus    schedule 04.12.2012
comment
Спасибо за предложение убрать else{}   -  person Fund Monica's Lawsuit    schedule 04.12.2012
comment
@Cerbrus На самом деле, хотя вы правы в том, что вы не можете просто запустить любой файл jar напрямую, запустить Java-апплеты очень просто. Эти апплеты, если они правильно подписаны, даже имеют доступ к вашей файловой системе и затем могут запускать другой файл jar. Кроме того, вы можете сделать возможным запуск произвольного jar-файла (с контрольными вопросами) с помощью Java WebStart.   -  person Markus A.    schedule 04.12.2012


Ответы (3)


Еще одна вещь, которую вы можете изучить, — это среда Java Web Start: http://en.wikipedia.org/wiki/Java_Web_Start

Это позволяет пользователям запускать произвольный файл jar непосредственно из своих браузеров и при необходимости устанавливать его на свои компьютеры. Итак, если все, что вам нужно, — это способ развертывания вашей Java-программы через веб-сайт, это может быть лучшим решением.

В этом случае код Java не будет выполняться «внутри» браузера (ну, внутри JVM, но привязанным к браузеру), как апплет, а вместо этого будет выполняться как стандартный отдельный процесс, как если бы вы запустили jar с жесткого диска вашего компьютера.

person Markus A.    schedule 04.12.2012
comment
Подождите, это кажется идеальным. Не обращайте внимания на мой предыдущий комментарий, я еще не прокрутил вниз до этого. - person Fund Monica's Lawsuit; 04.12.2012
comment
Не могли бы вы привести пример? Я не могу понять, куда вставить этот код. Он работал сам по себе, но мне нужно знать, где его разместить на реальной веб-странице. Извините :Р - person Fund Monica's Lawsuit; 04.12.2012
comment
Уф.... Я еще не использовал его сам. Я скоро буду, поэтому я уже прочитал об этом... Но, возможно, это поможет: docs.oracle.com/javase/6/docs/technotes/guides/javaws/ (особенно главы 2 и 3)? - person Markus A.; 04.12.2012
comment
Похоже, все, что вам нужно сделать, это разместить ссылку: <a href=http://www.MySite.com/app.jnlp>Launch the application</a>. Но вы можете сделать гораздо больше, чтобы убедиться, что все необходимые плагины/JRE/и т. д. установлены. Если ссылка — это все, что вам нужно, вы можете автоматически открыть ее из JavaScript с помощью чего-то вроде window.location.href="http://www.MySite.com/app.jnlp"... - person Markus A.; 04.12.2012
comment
Еще раз большое спасибо. Итак, все, что мне нужно сделать, это определить путь к .jar? И если да, то могу ли я сделать это так же, как в Java? То есть String path = System.getProperty('user.dir'); или что-то в этом роде. Кроме того, знаете ли вы, можно ли вызвать что-то, что сохранено в виде файла .jar? - person Fund Monica's Lawsuit; 05.12.2012
comment
@NickHartley Если файл jar уже находится на компьютере пользователя, вам действительно нужно найти способ узнать его местоположение. Вы можете, например, запросить это у пользователя. Но webstart больше предназначен для хранения файлов jar и jnlp на сервере вместе с вашим сайтом. Итак, я бы поместил его в папку в каталоге вашей веб-страницы на сервере и связал там. Затем браузер будет загружать банку пользователю по мере необходимости. - person Markus A.; 05.12.2012
comment
Извините, я чувствую, что ДЕЙСТВИТЕЛЬНО должен был упомянуть об этом раньше .... И веб-страница, и файл .jar находятся на компьютере - на самом деле веб-страница находится в том же файле .zip, что и файл .jar. Им не нужно загружать файл jar, просто щелкните ссылку или кнопку, чтобы ЗАПУСТИТЬ его. Еще раз извините, если я был неясен. Я попытаюсь удалить веб-сайт и заменить его веб-страницей, возможно, это немного устранит путаницу. - person Fund Monica's Lawsuit; 06.12.2012
comment
Ах! Тогда это имеет больше смысла... Если они находятся в одном и том же ZIP-файле, вы, вероятно, знаете относительные пути. Поэтому просто упакуйте файл jnlp в тот же каталог, что и ваш файл jar, и свяжите его относительной ссылкой из каталога, в котором находится ваша страница. Например, поместите веб-страницу (index.html) в корневую папку zip-файла, а затем создайте приложение в подкаталоге, а затем просто выполните <a href="app/myapp.jnlp">. Это должно делать свое дело... - person Markus A.; 07.12.2012
comment
Ах, так работают относительные каталоги. Это потрясающе, и я думаю, что сделаю это. Спасибо. Итак, чтобы убедиться, что это ДОЛЖЕН быть файл .jnlp? Это может вызвать проблемы, поскольку он также является плагином bukkit, поскольку Bukkit не может читать ничего, кроме файлов .jar. Если можно открыть файл .jar из .jnlp, то это сработает. Кроме того, как мне сделать .jnlp? Могу ли я просто экспортировать его с этим расширением? - person Fund Monica's Lawsuit; 07.12.2012

Если вы просто поместите статический тег <applet> или <object> где-нибудь на свою html-страницу, он всегда будет загружать ваш код Java.

Если вместо этого вы хотите загрузить его динамически позже или предоставить пользователю выбор, загружать его или сейчас, вы можете использовать следующую конструкцию в своем JavaScript:

var app = document.createElement('applet');
app.archive= 'Java.jar';  // Your java jar file here
app.code= 'Java.class';   // Your Main class that extends Applet
app.width = '400';        // The size of the area for displaying ...
app.height = '10';        //   ... the applet's graphical output
document.getElementsByTagName('body')[0].appendChild(app);

(Адаптировано из ответа Beachhouse здесь: Как я могу встроить Апплет Java динамически с Javascript?; здесь используется тег <applet>, но его можно легко изменить на использование вместо него тега <object>).

Важно, чтобы ваш код Java действительно расширял java.applet.Applet. Простого наличия функции main() в этом сценарии недостаточно. Затем у класса Applet есть методы, которые вы переопределяете (init(), destroy(), start() и stop()), которые вызываются автоматически, когда ваш апплет загружается/выгружается/отображается/скрывается. Вы также можете определить общедоступные функции в классе, реализующем Applet, которые затем можно вызывать для объекта app напрямую из JavaScript. Возможно, вам придется немного поиграть с этим, потому что есть некоторые различия в типах, которые используют Java и JavaScript, поэтому вы не можете просто вернуть или ожидать какой-либо тип параметра, но с небольшими пробами и ошибками (или чтением в Интернете), это работает довольно хорошо.

Одна вещь, которую вы должны иметь в виду, это то, что загрузка апплета занимает некоторое время. На самом деле, если браузер заблокирует апплет или пользователь нажмет кнопку «нет» в вопросе о разрешении, он может никогда не загрузиться. Поэтому вы, вероятно, не сможете сразу вызывать функции для объекта app. Вместо этого напишите себе небольшой таймер, который периодически проверяет, загрузился ли ваш апплет. Что я обычно делаю, так это определяю функцию public boolean isReady() в своем классе апплета, а затем использую следующий Javascript:

if (typeof app.isReady=='undefined') return false;
return app.isReady();

Но, конечно, если вы используете только методы init() и start() без вызова апплета из Javascript, вам не придется об этом беспокоиться.

person Markus A.    schedule 04.12.2012
comment
Отличный ответ, но я не слишком уверен, отвечает ли он на мой вопрос ... Я имел в виду получение веб-страницы - файла, загружаемого на их компьютер при загрузке плагина - запуска файла .jar отдельно от веб-страницы. Кроме того, как именно мне реализовать теги <object>, если это позволит мне это сделать? - person Fund Monica's Lawsuit; 04.12.2012

Думаю, вы ищете здесь тег <applet>.

<APPLET code="MyJAVAFile.jar"></APPLET>

Для HTML5 вы должны использовать тег <object>, что-то вроде этого:

<object type="application/x-java-applet" code="MyJAVAFile.jar"></object>

Вам также может быть интересна эта статья. Стоит прочтения.

person woodykiddy    schedule 04.12.2012
comment
Тег <applet> не поддерживается в HTML5. Вместо этого используйте тег <object>. Кроме того, элемент <applet> устарел в HTML 4.01. - person Cerbrus; 04.12.2012
comment
Будет ли тег <object> функционировать таким же образом? То есть <object code="javaFile.jar"></object>? - person Fund Monica's Lawsuit; 04.12.2012
comment
Это почти то же самое, только более общее - person SomeJavaGuy; 04.12.2012