Как запустить java проект на другом компьютере

Обновлено: 04.07.2024

Я сделал приложение java, которое хранит данные из a .csv-файл в базу данных MySql. Теперь мой клиент хочет загрузить это приложение в свое веб-пространство (веб-пространство, которое он взял для своего веб-сайта), чтобы он мог запустить эту программу на этом сервере.

я использовал FileZilla программа для загрузки программа для его веб-хостинг, но теперь я не знаю как запустить эту программу на своем сервере.

чтобы запустить его в localsystem, необходимо открыть окно командной строки для запуска он.

есть ли какая-либо конкретная функция, которую веб-хостинг должен поддерживать для запуска этой программы java?

поскольку он хранит данные из файла (.csv-файл) в базу данных MySql, тогда было бы лучше развернуть эту программу на сервере, на котором размещается база данных, а не на сервере, на котором размещается веб-сайт?

действительно, говоря "веб-приложение", мы обычно имеем в виду специальное приложение, запрограммированное для работы на веб-сервере все время, просто ожидая запросов от пользователя для обработки.

в вашем случае, у вас есть консольное приложение.

в зависимости от конфигурации сервера ни одно из этих приложений не может быть запущено на вашем клиентском веб-хостинге, ни одно из них или оба.

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

в случае внутреннего сервера компании вам нужно попросить своего клиента и его ИТ-материал настроить это.

наконец, вам нужно спросить: 1. Поддерживает ли сервер SSH? - это просто пульт дистанционного управления. Обычно он работает на порту 22, и вы многие проверяете его с помощью команды " telnet yourserver 22" (windows и linux) - если он не отклоняет ваше соединение - настроены означает, что SSH-это. 2. Установлен ли на вашем сервере java и доступен ли он для вашей учетной записи через SSH-соединение?

  1. только если ваш клиент действительно означает веб-приложение вместо консольного приложения, вам нужно спросить, есть ли у сервера сервер веб-приложений для Java - обычно это что-то вроде Apache Tomcat, Jetty, JBoss, Weblogic и т. д. Но этот способ потребует модификации приложения, чтобы запустить его на веб-сервере.

Если вы решите использовать консольное приложение, а не" обновлять " его до веб-приложения, вы действительно можете запустить его на хосте, на котором работает ваша база данных (опять же, вам понадобится SSH). Вы сэкономите время на операциях удаленного доступа к базе данных-теоретически ваша программа будет работать быстрее.

наличие "веб-пространства" не обязательно означает, что он имеет достаточный доступ к серверу для запуска произвольных программ (или базы данных MySql).

вы может потенциально перепишите приложение как веб-приложение, но это может быть не очень хорошо подходит.

первое, что нужно проверить, является ли он can войдите в систему для запуска программ с консоли некоторого описания. Если он может, то все в порядке - и путь свободен. Если он не может, вам нужно подумать о том, почему он действительно хочет, чтобы это было на его веб - сервере, и имеет ли смысл запускать приложение там-или лучше сделать это в другом месте.

ваше приложение, скорее всего, консольное, а не веб-приложение.

вашему клиенту нужно будет SSH на сервер и сделать что-то вроде:

Если у вашего веб-хоста есть java, вы можете попробовать выполнить его из php cronjob без необходимости ssh:

Одна из основных трудностей распространения Java программ – необходимость наличия на компьютере пользователя среды выполнения Java Runtime Environment (JRE). Именно поэтому переносные (portable) приложения на Java редкость.

В тоже время эту проблему вполне можно разрешить и создать не только переносное, но и «обычное» приложение, которое не будет требовать наличия предустановленной JRE.

Однако, учитывая кроссплатформенность Java, сразу отметим, что в данной статье речь пойдёт о решении данной задачи применительно к среде Windows.

Существует два основных подхода к решению данной задачи.

Способ 1. Преобразование в нативный код

Иначе говоря, преобразование из jar в exe.

Казалось бы, это самый очевидный способ. Но, на самом деле, он самый трудно реализуемый и практически не работоспособный.

Сконвертировать jar в exe в принципе не проблема. В частности, есть масса утилит, которые позволяют это сделать. Однако подавляющее практически все они не избавляют от необходимости устанавливать JRE. Без JRE exe файл, созданный этими утилитами, всё равно не запустится.

Те же из них, что, если верить описанию, претендуют на полное решение данной проблемы, давно не развиваются и перед применением их необходимо самих компилировать из исходных кодов.

Способ 2. Использование переносной версии JRE

Этот способ основан на том, что JRE может работать и без установки на компьютер. Достаточно скачать архив с официальной страницы загрузки (ссылка в конце статьи) и распаковать его в любую папку. После этого JRE уже готов к работе.

Однако запустить Java программу в этом случае можно только двумя способами:

  • Из командной строки;
  • С помощью программы загрузчика.

Первый вариант не подходит, так как слишком сложен для рядового пользователя. Остаётся второй.

Принцип работы загрузчика, на самом деле, достаточно прост. Программа передаёт JRE команды необходимые для запуска Java приложения и после этого закрывается. Тем самым автоматизируя процесс запуска, выполняемый в случае командной строки вручную.

Рассмотрим пример написания такого загрузчика на Delphi. Предположим, что загрузчик, jar файл с Java приложением и папка с JRE расположены в одной общей папке.

Определим константы (относительный путь к исполняемому файлу JRE и передаваемые команды (включают относительный путь к файлу Java приложения)).

В этой статье объясняется, что такое Java Web Start (JWS), как настроить его на стороне сервера и как создать простое приложение.

1. Обзор

В этой статье объясняется, что такое Java Web Start (JWS), как настроить его на стороне сервера и как создать простое приложение.

Примечание: JWS был удален из Oracle JDK, начиная с Java 11. В качестве альтернативы рассмотрите возможность использования Open Web Start .

2. Введение

JWS-это среда выполнения, которая поставляется вместе с Java SE для веб-браузера клиента и существует с версии Java 5.

При загрузке файлов JNLP (также известных как протокол запуска сети Java) с веб-сервера эта среда позволяет нам удаленно запускать пакеты JAR, на которые она ссылается.

С общего веб-сайта можно загрузить файл JNLP для выполнения приложения JWS. После загрузки его можно запустить непосредственно из ярлыка на рабочем столе или средства просмотра кэша Java. После этого он загружает и выполняет файлы JAR.

Этот механизм может быть очень полезен для предоставления графического интерфейса, который не является веб-интерфейсом (без HTML), такого как приложение для безопасной передачи файлов, научный калькулятор, безопасная клавиатура, локальный браузер изображений и так далее.

3. Простое приложение JNLP

Хороший подход-написать приложение и упаковать его в файл WAR для обычных веб-серверов. Все, что нам нужно, это написать желаемое приложение (обычно с помощью Swing) и упаковать его в файл JAR. Затем этот JAR, в свою очередь, должен быть упакован в файл WAR вместе с JNLP, который будет ссылаться, загружать и выполнять класс Main своего приложения в обычном режиме.

Нет никакой разницы с обычным веб-приложением, упакованным в файл WAR, за исключением того факта, что нам нужен файл JNLP для включения JWS, как будет показано ниже.

3.1. Java-приложение

Давайте начнем с написания простого Java-приложения:

Мы видим, что это довольно простой класс свинга. Действительно, ничего не было добавлено, чтобы сделать его совместимым с JWS.

3.2. Веб-приложение

Все, что нам нужно, это упаковать этот пример класса Swing в файл WAR вместе со следующим файлом JNLP:

Давайте назовем его hello.jndi и поместим в любую веб-папку нашей ВОЙНЫ. И JAR, и WAR загружаются, поэтому нам не нужно беспокоиться о том, чтобы поместить JAR в папку lib .

URL-адрес нашей последней банки жестко закодирован в файле JNLP, что может вызвать некоторые проблемы с распространением. Если мы изменим серверы развертывания, приложение больше не будет работать.

Давайте исправим это с помощью правильного сервлета позже в этой статье. А пока давайте просто поместим файл JAR для загрузки в корневую папку в качестве index.html , и связать его с элементом привязки:

Давайте также установим основной класс в нашем JAR-манифесте . Это может быть достигнуто путем настройки плагина JAR в pom.xml файл. Аналогично, мы перемещаем файл JAR за пределы WEB-INF/lib , поскольку он предназначен только для загрузки, т. е. не для загрузчика классов:

4. Специальные конфигурации

4.1. Вопросы безопасности

Чтобы запустить приложение, нам нужно подписать банку . Создание действительного сертификата и использование плагина JAR Sign Maven выходит за рамки этой статьи, но мы можем обойти эту политику безопасности в целях разработки или если у нас есть административный доступ к компьютеру нашего пользователя.

5. JnlpDownloadServlet

5.1. Алгоритмы сжатия

Есть специальный сервлет, который можно включить в нашу ВОЙНУ. Он оптимизирует загрузку, ища наиболее сжатую скомпилированную версию нашего файла JAR, если она доступна, а также исправляет жестко закодированное значение codebase в файле JLNP.

Поскольку наша БАНКА будет доступна для загрузки, рекомендуется упаковать ее с помощью алгоритма сжатия, такого как Pack200, и доставить обычную банку и любой пакет JAR.PACK.GZ или JAR.GZ сжатая версия в той же папке, чтобы этот сервлет мог выбрать лучший вариант для каждого случая.

К сожалению, пока нет стабильной версии плагина Maven для этого алгоритма сжатия, но мы можем работать с исполняемым файлом Pack200, который поставляется с JRE (обычно устанавливается по пути /jre/bin/ ).

Без изменения JNLP и путем размещения jar.gz и jar.pack.gz версии JAR в той же папке, сервлет выбирает лучшую, как только он получает вызов от удаленного JNLP. Это улучшает пользовательский интерфейс и оптимизирует сетевой трафик.

5.2. Динамическая подстановка Кодовой Базы

Сервлет также может выполнять динамические замены жестко закодированных URL-адресов в теге . Изменив JNLP на подстановочный знак , он доставит тот же окончательный тег визуализации.

5.3. Добавление сервлета в путь к классу

Чтобы добавить сервлет, давайте настроим обычное сопоставление сервлетов для шаблонов JAR и JNLP для вашего web.xml :

Сам сервлет поставляется в виде набора банок ( jardiff.jar и jnlp-servlet.jar ), которые в настоящее время находятся в разделе демонстраций и образцов на странице загрузки Java SDK.

В примере GitHub эти файлы включены в папку java-core-samples-lib и включены в качестве веб-ресурсов плагином Maven WAR:

6. Заключительные мысли

Java Web Start-это инструмент, который может использоваться в средах (интрасети), где нет сервера приложений. Кроме того, для приложений, которым необходимо манипулировать локальными файлами пользователей.

В начале будет рассмотрено создание элементарного клиент-сервера, для усвоения базовых знаний, на основе которых будет строиться многопоточная архитектура.

— Потоки: для того чтобы не перепутать что именно подразумевается под потоком я буду использовать существующий в профессиональной литературе синоним — нить, чтобы не путать Stream и Thread, всё-таки более профессионально выражаться — нить, говоря про Thread.

— Сокеты(Sockets): данное понятие тоже не однозначно, поскольку в какой-то момент сервер выполняет — клиентские действия, а клиент — серверные. Поэтому я разделил понятие серверного сокета — (ServerSocket) и сокета (Socket) через который практически осуществляется общение, его будем называть сокет общения, чтобы было понятно о чём речь.

Спасибо за подсказку про Thread.sleep();!
Конечно в реальном коде Thread.sleep(); устанавливать не нужно — это моветон! В данной публикации я его использую только для того чтобы выполнение программы было нагляднее, что бы успевать разобраться в происходящем.
Так что тестируйте, изучайте и в своём коде никогда не используйте Thread.sleep();!

1) Однопоточный элементарный сервер.
2) Клиент.
3) Многопоточный сервер – сам по себе этот сервер не участвует в общении напрямую, а лишь является фабрикой однонитевых делегатов(делегированных для ведения диалога с клиентами серверов) для общения с вновь подключившимися клиентами, которые закрываются после окончания общения с клиентом.
4) Имитация множественного обращения клиентов к серверу.

Итак, начнём с изучения структуры однопоточного сервер, который может принять только одного клиента для диалога. Код приводимый ниже необходимо запускать в своей IDE в этом идея всей статьи. Предлагаю все детали уяснить из подробно задокументированного кода ниже:

Сервер запущен и находится в блокирующем ожидании server.accept(); обращения к нему с запросом на подключение. Теперь можно подключаться клиенту, напишем код клиента и запустим его. Клиент работает когда пользователь вводит что-либо в его консоли (внимание! в данном случае сервер и клиент запускаются на одном компьютере с локальным адресом — localhost, поэтому при вводе строк, которые должен отправлять клиент не забудьте убедиться, что вы переключились в рабочую консоль клиента!).
После ввода строки в консоль клиента и нажатия enter строка проверяется не ввёл ли клиент кодовое слово для окончания общения дальше отправляется серверу, где он читает её и то же проверяет на наличие кодового слова выхода. Оба и клиент и сервер получив кодовое слово закрывают ресурсы после предварительных приготовлений и завершают свою работу.
Посмотрим как это выглядит в коде:

А что если к серверу хочет подключиться ещё один клиент!? Ведь описанный выше сервер либо находится в ожидании подключения одного клиента, либо общается с ним до завершения соединения, что делать остальным клиентам? Для такого случая нужно создать фабрику которая будет создавать описанных выше серверов при подключении к сокету новых клиентов и не дожидаясь пока делегированный подсервер закончит диалог с клиентом откроет accept() в ожидании следующего клиента. Но чтобы на серверной машине хватило ресурсов для общения со множеством клиентов нужно ограничить количество возможных подключений. Фабрика будет выдавать немного модифицированный вариант предыдущего сервера(модификация будет касаться того что класс сервера для фабрики будет имплементировать интерфейс — Runnable для возможности его использования в пуле нитей — ExecutorServices). Давайте создадим такую серверную фабрику и ознакомимся с подробным описанием её работы в коде:

  • Модифицированный Runnable сервер для запуска из предыдущего кода:
  • 4) Имитация множественного обращения клиентов к серверу.

Как видно из предыдущего кода фабрика запускает — TestRunnableClientTester() клиентов, напишем для них код и после этого запустим саму фабрику, чтобы ей было кого исполнять в своём пуле:

Запускайте, вносите изменения в код, только так на самом деле можно понять работу этой структуры.

Читайте также: