Как связать jar-пакеты с файлами *.java во время компиляции с использованием GCJ?

У меня есть следующие файлы:

A.jar (содержит файлы *.class)
B.jar (содержит файлы *.class)
Program.java (содержит класс Program с функцией main, зависящей от A.jar и B.jar)

Как я могу создать исполняемый файл программы с использованием GCJ?

2 ответа

Решение

Это работает для меня:

gcj -c A.jar -o Ao
gcj -c B.jar -o Bo
gcj --main = Программа --classpath=A.jar:B.jar -o Программа Ao Bo Program.java

Прошло много времени с тех пор, как я поигрался с Java, поэтому следующее в основном не в моей голове.

В Linux обычно Java-программа запускается скриптом-оберткой. Для вашего случая этот скрипт-обертка может быть Program, содержимое:

#!/bin/sh
java -cp A.jar:B.jar:/path/to/dir/where/Program.class/is/in Program

Если вы предпочитаете иметь только один файл jar, то вы можете "разархивировать" A.jar и B.jar и создать новый jar, например Program.jar, который содержит все классы из A.jar, B.jar и вашей Программы.class, и вы создаете небольшой файл манифеста, который сообщает, какой класс должен быть запущен при запуске файла jar (в данном случае это ваш Program.class).

Содержимое файла манифеста (назовем его manifest.txt):

-----8<------
Main-Class: Program

----->8------

Обратите внимание на пустую строку после строки "Main-Class: Program" - это необходимо.

Таким образом, создать сингл Program.jar:

gcj --classpath A.jar:B.jar Program.java
mkdir tmp
cd tmp
jar xf ../A.jar
jar xf ../B.jar
cp ../Program.class .
jar cmf ../manifest.txt ../Program.jar .
cd ..

Теперь создайте оболочку сценария оболочки Program:

#!/bin/sh
java -jar /path/to/Program.jar

Сделайте его исполняемым:

chmod +x Program

и запустить его:

./Program

Аплодисменты, если это работает, иначе бросайте гнилые помидоры!

Другие вопросы по тегам