Как запустить приложение Java из моего приложения Java?

У меня есть два java-приложения (1,2), и я хочу запустить приложение 2 из приложения 1. Сначала я попытался создать файл .jar приложения 2 и запустить его с помощью ProcessBuilder. Это работало, пока я не захотел найти что-то внутри приложения 2, что-то с отсутствующими пакетами и прочее.

Затем я подумал, что вместо этого я могу просто запустить application2.java из ProcessBuilder в приложении 1, но это не кажется правильным способом сделать это? Теперь я получаю ошибки, пакеты отсутствуют, но на более ранней стадии (приложение вообще не запускается).

Я делаю это в Ubuntu. Какие-нибудь советы?


person cloms    schedule 09.01.2014    source источник
comment
Должен ли app2 быть независимым приложением или это расширение/плагин app1? В последнем случае предпочтительнее загружать jar в новый загрузчик классов в app1. В первом случае должны ли они взаимодействовать друг с другом (использовать сериализацию или сокеты) или приложение2 просто вычисляет что-то, что оно возвращает в качестве вывода? Последний случай: Process proc = Runtime.getRuntime().exec("/bin/bash","-c","java -jar App2.jar parameters passed to the app"); // read the input stream obtained by proc.getInputStream()   -  person Roman Vottner    schedule 09.01.2014
comment
Приложение 2 использует файл XML, созданный приложением 1, для визуализации определенных терминов из Wordnet. Я пробовал это: ProcessBuilder pb = new ProcessBuilder(myjar.jar); и это запускает банку и открывает программу. Но затем я получаю некоторые ошибки, когда приложение 2 пытается найти ресурсы wordnet: Исключение в потоке AWT-EventQueue-0 edu.smu.tspell.wordnet.impl.file.RetrievalException: Ошибка при открытии индексного файла: resources/WordNet-3.0/dict /index.sense (Нет такого файла или каталога) Я почти уверен, что файлы wordnet включены в банку, но, возможно, пути как-то неверны.   -  person cloms    schedule 09.01.2014
comment
resources/WordNet-3.0/dict/index.sense звучит как структура, похожая на maven. Я скорее уверен, что в вашей банке нет каталога resources/.., поэтому он не сможет найти ресурс. Откройте app2.jar с помощью f.e. 7-zip и посмотрите, есть ли запись /Wordnet-3.0/dict/index.sense — если да, вам нужно изменить ваше приложение2, чтобы загружать ресурсы через getClass().getResource("/WordNet-3.0/dict/index.sense");, а не пытаться загрузить его через src/resources/...   -  person Roman Vottner    schedule 09.01.2014
comment
Я добавил ресурсы пустой папки (в intelliJ) и добавил wordnet внутри этой карты, надеясь, что это сработает, поэтому resources/wordnet-3.0/dict/index.sense существует.   -  person cloms    schedule 09.01.2014
comment
то, что он существует в IntelliJ, не означает, что он существует внутри банки, и банка пытается найти необходимые ресурсы, а не IntelliJ! При использовании maven для управления зависимостями и/или по причинам развертывания у вас обычно будет структура проекта, которая содержит структуру /src/main/resources/..., где каждый файл, указанный в этом каталоге, копируется в банку - поскольку вы, вероятно, не используете что-то подобное, как это должно получиться скопировано в банку?   -  person Roman Vottner    schedule 09.01.2014
comment
Если он должен найти файлы за пределами банки, вы можете использовать что-то вроде этого: String file = System.getProperty("user.dir")+"/resources/Wordnet-3.0/...". "user.dir" будет использовать каталог, из которого была выполнена команда java -jar ..., а затем искать структуру подкаталога `/resources/Wordnet-3.0/...   -  person Roman Vottner    schedule 09.01.2014
comment
Извините, я сделал карту во время создания Jar в IntelliJ, добавил ресурсы wordnet внутри этой карты, поэтому она существует в банке. Структура такая же, как и в IntelIj.   -  person cloms    schedule 09.01.2014
comment
Роман Воттнер Я нашел эту строку в коде из сообщения об ошибке: System.setProperty(wordnet.database.dir, resources/WordNet-3.0/dict); Я пытался поставить ./ впереди, а также прокомментировать строку, но та же проблема (разные пути).   -  person cloms    schedule 09.01.2014
comment
ОК, использовал трюк Эндрю Томпсона из этой темы: « title = «почему моя программа улавливает исключение filenotfoundException, когда файл существует»> stackoverflow.com/questions/16116469/, и мой путь - приложение 1. Я думаю, что я буду импортировать банку в приложение 1 и запустите его как-нибудь из ProcessBuilder или просто создайте новый экземпляр этого приложения.   -  person cloms    schedule 09.01.2014
comment
Спасибо за вашу помощь. Что я в итоге сделал: создал банку приложения 2, импортировал эту банку в приложение 1, я скопировал все ресурсы/словосети в рабочее пространство приложения 1, и это работает. Спасибо за вашу помощь!   -  person cloms    schedule 09.01.2014


Ответы (1)


Добавить приложение. 2 в путь к классам во время выполнения app. 1 и вызывать его классы или методы напрямую, было бы самым простым способом с лучшей обратной связью (т. е. вместо получения «выходного значения 1» вы могли бы увидеть NoClassDefFoundError ThisIsTheMissingClassName).

person Andrew Thompson    schedule 09.01.2014
comment
Хорошо, теперь два приложения находятся в разных рабочих областях, это не вызывает проблем? В IntelliJ я перехожу к сборке — редактированию конфигураций, но не могу добавить ничего, чего нет в той же рабочей области. Если это правильный путь, конечно? - person cloms; 09.01.2014
comment
Слышали выражение «Хвост виляет собакой»? Кажется, это применимо здесь, где IntelliJ — это хвост, а вы — собака. Я предполагал, что вы делаете это в обстоятельствах, когда у вас есть 2 (или более) Jar, и на самом деле не думаю, что это имеет какое-либо отношение к вашей среде IDE. Я имею в виду, подумайте об этом, ожидается ли, что конечный пользователь установит IntelliJ для запуска приложения. 1? - person Andrew Thompson; 09.01.2014
comment
Нет, это не идеальный вариант, но теперь экспорт приложения 2 в .jar выдает ошибки об отсутствующих пакетах. Это приложение создано не мной, и некоторые зависимости, вызывающие отсутствующие пакеты, являются внешними jar-файлами внутри этого приложения. Вот почему я хотел бы запустить это из IDE, и, возможно, позже я смогу сосредоточиться на том, как создавать банки (что действительно является лучшим и единственным хорошим решением). - person cloms; 09.01.2014
comment
В этом случае, возможно, вам следует задать совершенно отдельный вопрос с прикрепленным тегом IntelliJ. Хотя я уверен, что это отличная IDE (я слышал, что она лучше, чем Netbeans или Eclipse, которые я использую), я не использую IntelliJ и вообще не помогаю с IDE. Я чувствую, что мое время и опыт лучше потратить на мои сильные темы — Java и Swing. - person Andrew Thompson; 09.01.2014
comment
Если app2 требует дополнительных библиотек, вам нужно добавить эти библиотеки в путь при вызове jar: jar -cp requiredLib.jar;app2.jar main.class.of.app2 или изменить ссылку MANIFEST.MF вашего app2.jar соответственно - person Roman Vottner; 09.01.2014