#java
#java
Вопрос:
Я закончил писать программу на Java и готов экспортировать ее. Я создал работоспособный jar из Eclipse. Запуск jar отлично работает на моем компьютере, но выдает ошибку «Не удалось найти основной класс» на любом другом компьютере (включая мой другой компьютер, на котором я пишу Java).
Всякий раз, когда я ищу других людей, у которых возникла проблема, это всегда один и тот же ответ: проверьте файл манифеста. Я не вижу никаких проблем с моим (плюс, не могу представить, почему это будет работать на моем компьютере, а не на чьем-то еще)
Манифест:
Manifest-Version: 1.0
Main-Class: my.quick.monster.QuickMonster
И я также пытался:
Manifest-Version: 1.0
Class-Path: .
Main-Class: my.quick.monster.QuickMonster
Оба работают у меня, но не на других компьютерах.
Комментарии:
1. Без знания макета jar и того, как вы им управляете, помочь будет сложнее 🙂
2. 1 за то, что сказал @Dave. Как ты пытаешься запустить jar? Что внутри него? Находится
QuickMonster
в корне jar или у вас есть вложенные папки внутри jar?3. БАНКА содержит: my/quick/monster/QuickMonster.class my/quick/monster/RTFFilter.class my/quick/monster/DispWindow.class META-INF/МАНИФЕСТ. MF Я запустил его двойным щелчком мыши и через командную строку. Друзья запускали его только двойным щелчком мыши
4. Чтобы другие люди могли управлять им? Означает ли это, что проблема решена? Какие зависимости есть у вашего кода? Может быть, в других библиотеках?
5. Ни у кого другого это не запускалось. Они ПОПЫТАЛИСЬ запустить его с помощью двойного щелчка. В любом случае, я использую несколько компонентов javax.swing и java.awt и один экземпляр java.io.file
Ответ №1:
Размышляя о том, что может пойти не так, вот еще несколько вещей, которые нужно проверить:
- убедитесь, что в конце строк нет ложных символов (табуляции, пробелов).
- убедитесь, что основной класс действительно находится в файле JAR с правильным именем.
- на работающем компьютере попробуйте изменить свой текущий каталог и посмотреть, работает ли он по-прежнему.
- убедитесь, что вы используете одну и ту же версию Java на каждой машине. Запустите
java -version
для проверки. - убедитесь, что вы запускаете его как исполняемый файл JAR; т.е. как
java -jar foo.jar
не какjava -cp foo.jar
.
(Одна теория заключается в том, что JAR работает на одной машине, несмотря на манифест; например, что он находит класс через classpath в вашей переменной окружения CLASSPATH или что-то в этом роде.)
Подводя итог для других людей, проблема OP оказалась в том, что он скомпилировал свой код с / для Java 7 и пытался запустить JAR на старых установках Java. Это не сработало из-за номеров версий файла класса.
Вы можете скомпилировать свой код так, чтобы он выполнялся на более старой версии Java, но вам нужно использовать -target
опцию при компиляции, и вам следует использовать опцию -bootclasspath для компиляции с rt.jar
самой старой версией Java. Обычная среда IDE упростит это, позволяя вам указать целевую платформу сборки, но стоит разобраться в технических деталях для случаев, когда вы не используете IDE.
(Я удивлен, что java
команда не упомянула номер версии classfile в сообщении об ошибке …)
Комментарии:
1. Все три компьютера, которые я проверил, имели разные версии. Компьютер, на котором он работает, имеет 1.7.0_01, другой компьютер — 1.6.0_25, а у друга — 1.5.0_22. Неужели это не сможет быть запущено на других версиях Java? И если да, могу ли я что-нибудь с этим сделать?
2. @ManInBlack Вы скомпилировали его как 1.7? Если это так, более ранние JVM не смогут запустить его из-за этого. Установите для него значение compile as 1.5. Это также та информация, которую полезно представить заранее.
3. Сработало, спасибо! В свою защиту скажу, что я не знал, что это вообще возможно, не говоря уже о том, чтобы что-то передавать.
Ответ №2:
Убедитесь, что файл MANIFEST.MF содержит пустую строку в конце. Если Main-Class
определение находится в самой последней строке файла, некоторые загрузчики классов игнорируют его.
Комментарии:
1. Есть несколько пустых строк. Экспериментируя, я обнаружил, что у меня это тоже не сработает без правильных пробелов. Кажется, нравится иметь ровно 5 строк.
Ответ №3:
Никогда не используйте ‘eclipse-jar-отлично работал на моем компьютере’. Я использую плагин maven shade jar, который превосходно создает готовый к запуску jar со всеми зависимостями, указанным основным классом и т.д.
РЕДАКТИРОВАТЬ: Что не так с eclipse-builded-jar, так это то, что вы не сможете собрать его без elcipse. Maven — это обычный инструмент, широко используемый для сборки пакетов любого типа. Это автоматизировано и означает, что его можно использовать в среде CI и т.д. И цель хорошего разработчика — написать код так, чтобы его можно было легко перенести в CI.
Однако, если это не обычная задача, предполагающая выполнение только один / два раза, то, возможно, решение ‘eclipse’ также имеет некоторые преимущества. Но я ответил, имея в виду некоторые случаи из моего прошлого, когда люди создавали пакеты в GUI только потому, что им не удалось сделать это в maven.
Итак, я надеюсь, что есть достаточно аргументов для maven против eclipse, поэтому, пожалуйста, прекратите понижать голос: D
Комментарии:
1. Вместо того, чтобы предлагать другой инструмент, лучше изучить проблему с его текущим jar. Ответ на «мой jar не будет запускаться» не всегда «используйте плагин maven».
2. Плагин также является инструментом. Ему не нужен другой инструмент — ему нужно понимание того, как Java запускает код из файла jar.
3. Я не говорю, что он должен избегать всех инструментов. Я говорю, что ответ на этот самый вопрос — это не другой инструмент.
4. Вы знаете, что еще предстоит указать какую-либо причину, по которой jar, созданный «плагином maven shade jar plugin», будет лучше, чем тот, который создан eclipse? Более того, вы действительно думаете, что самое простое решение для jar, которое построено неправильно, — это изучение maven? Мне нравится maven, но если все, что вы хотите сделать, это создать файл jar, maven — это полный перебор, и его намного сложнее использовать, чем экспорт jar из eclipse.
5. @meriton если вы хотите научить, как работает Java, лучше объясните это с помощью utlis командной строки — javac, jar, java и т.д. Но обучение eclipse вместо maven — плохой подход, он сохраняет непонимание.