Не могу скомпилировать банку, если добавлен в пакет - PullRequest
2 голосов
/ 09 февраля 2012

Проблема: я написал Java-программу hello world, скомпилировал и создал ее файл jar - ИДЕАЛЬНО, никаких проблем там нет.

Теперь я добавил следующее в начало исходного кода

package za.ac.uj.csc2a;

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

del *.class
del *.jar
del *.txt

echo compiling HelloWorld.java.....

javac HelloWorld.java

javap -c HelloWorld.class > ByteCode.txt

jar cfe HelloWorld.jar HelloWorld HelloWorld.class

java -jar za.ac.uj.csc2a.HelloWorld.jar

я получаю,

Error: Unable to acces jarfile za.ac.uj.csc2a.HelloWorld.jar

Любые советы....


Вот последний файл bat, который работает

del *.class
del *.jar
del *.txt
RD /Q /S bin

echo compiling HelloWorld.java.....

MD bin

javac -d bin za/ac/uj/csc2a/HelloWorld.java
javap -c bin/za/ac/uj/csc2a/HelloWorld.class > ByteCode.txt
jar cfe HelloWorld.jar za.ac.uj.csc2a.HelloWorld -C bin .
java -jar HelloWorld.jar
pause

большое спасибо

Aiden

Ответы [ 6 ]

2 голосов
/ 09 февраля 2012

Опция -jar принимает имя файла , а не класс .

Вы должны просто сделать

java -jar HelloWorld.jar

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

Файл манифеста должен выглядеть как

Main-Class: za.ac.uj.csc2a.HelloWorld

и вы включаете его с опцией m в команде jar.

Также кажется, что вы добавляете .class-файл в корень файла jar. Должен быть в каталоге za.ac.uj.csc2a


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

java -cp HelloWorld.jar za.ac.uj.csc2a.HelloWorld
1 голос
/ 09 февраля 2012

Ваша банка называется Helloworld.jar:

 jar cfe HelloWorld.jar HelloWorld HelloWorld.class

Но вы называете его с именем пакета в качестве префикса к банке:

 java -jar za/ac/uj/csc2a/HelloWorld.jar

 java -jar HelloWorld.jar

должно быть правильно.

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

proj
|-- src
|   |-- za
|       |-- ac
|           `-- HelloWorld.java
|-- bin
    |-- za
        |-- ac
            `-- HelloWorld.class

Вы можете перейти в каталог src и скомпилировать с помощью:

 javac -d ../bin za/ac/HelloWorld.java

(для удобства уменьшена длина пакета / пути). При необходимости будет создана структура каталогов в bin (или часто classes)

Затем, чтобы объединить все с правильной структурой каталогов, вы изменяете на proj и выдаете:

jar cfe HelloWorld.jar za.ac.HelloWorld -C bin . 

Точка обозначает весь каталог.

jar -help 

расскажет вам больше вариантов. Для создания пригодной для работы банки вам также необходим манифест. В противном случае вы можете запустить свое приложение:

java -cp HelloWorld.jar za.ac.HelloWorld 

(снова немного сократил путь).

Обратите внимание, что структура каталога должна отражать объявление пакета. Вы не можете опустить деталь (za) и перейти в следующий каталог (ac). Класс для запуска - za.ac.HelloWorld, и поэтому он ищется в za / ac / - независимо от того, находится ли он в файловой системе или в jar-файле.

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

Для банки, которую можно начинать с java -jar, вам нужен манифест. Шаблон генерируется командой jar. Там вы добавляете

Main-Class: za.ac.HelloWorld

со следующей пустой строкой. Опять же: нужно полное имя с пакетом. Main-Class не может быть написано как Mainclass. За HelloWorld не должно следовать .class или .java - распространенные ошибки! Но, как вы знаете, вы можете использовать ключ -e, чтобы указать основной класс, но снова: включите имя пакета.

0 голосов
/ 09 февраля 2012

Вы создаете банку с именем HelloWorld.jar:

jar cfe HelloWorld.jar HelloWorld HelloWorld.class

Затем пытаетесь вызвать другое имя банки (za.ac.uj.csc2a.HelloWorld.jar):

java -jar za.ac.uj.csc2a.HelloWorld.jar

Они должны быть последовательными

0 голосов
/ 09 февраля 2012

поместите все файлы в нужные каталоги

Ты уверен в этом? Поскольку, если ваш код находится в пакете za.ac.uj.csc2a, тогда ваш исходный файл должен находиться в каталоге za\ac\uj\csc2a, вы должны скомпилировать его с помощью команды, подобной этой:

javac za\ac\uj\csc2a\HelloWorld.java

, а также внутри файла JAR он должен находиться внутри каталога с таким именем, поэтому вы должны упаковать JAR с помощью команды, подобной этой:

jar cf HelloWorld.jar za\ac\uj\csc2a\HelloWorld.class

Вы сможете выполнить его только с помощью java -jar, если это исполняемый файл jar, другими словами, если вы добавите файл манифеста в JAR с правильным атрибутом Main-Class. Если вы этого не сделали, вы сможете запустить его из JAR с помощью:

java -cp HelloWorld.jar za.ac.uj.csc2a.HelloWorld

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

java -jar HelloWorld.jar
0 голосов
/ 09 февраля 2012

Вы должны вызвать java -jar HelloWorld.jar вместо java -jar za.ac.uj.csc2a.HelloWorld.jar

0 голосов
/ 09 февраля 2012

Ваш файл jar называется HelloWorld.jar, а не za.ac.uj.csc2a.HelloWorld.jar.Очевидно, что Java не находит его.

Файл jar Содержимое должно соответствовать иерархии пакетов, поэтому внутри файла jar, HelloWorld.class должен находиться в папке za/ac/uj/csc2a.

...