2012-02-22 2 views
0

Я очень новичок в программировании, но я стараюсь учиться. Я немного подхватил, но некоторые понятия, похоже, перевернуты над моей головой. Похоже, когда вы учитесь, как я, и вы ищете проблему, вы получаете много разных ответов. Иногда способ формулирования ответов может быть путаным для новичка. Во всяком случае, вот моя проблема.Не удалось найти главный класс ... jar или manifest

Я создал очень простую программу, которая будет выполнять базовый расчет блоков CMU в стене. Я использовал JOptionPane вместо консоли. Я написал код в блокноте, а затем сохранил его как .java-файл (blocktestgui.java). Затем я скомпилировал его с помощью команды «javac blocktestgui.java», чтобы получить файл «bg.class». Я могу запустить программу из cmd с помощью «java bg», и она отлично работает. Моя настоящая проблема связана с файлом jar. Я создал файл manifest.txt с Main-Class: bg, затем пустую строку. Затем я использую «jar cvmf manifest.txt CMU.jar bg.class», и я получаю файл jar. Тогда всякий раз, когда я запускаю его (в cmd или двойном щелчке), я получаю ошибку «Не могу найти основной класс».

Вот что у меня есть:

Мой файл Java:

import javax.swing.JOptionPane; 

class bg { 
    public static void main(String[] args) { 
     String firstNumber, secondNumber; 
     double number1, number2, sum; 

     firstNumber = JOptionPane.showInputDialog(
       "Enter wall length in decimal feet:", 
       JOptionPane.INFORMATION_MESSAGE); 

     secondNumber = JOptionPane.showInputDialog(
       "Enter wall height in decimal feet:", 
       JOptionPane.INFORMATION_MESSAGE); 

     number1 = Double.parseDouble(firstNumber); 
     number2 = Double.parseDouble(secondNumber); 

     sum = (number1 * number2)/0.88; 

     JOptionPane.showMessageDialog(null, "Total Blocks are " + sum, 
       "Results", JOptionPane.PLAIN_MESSAGE); 

     System.exit(0); 
    } 
} 

Моя баночка содержит мой файл bg.class и это то, что выглядит мой файл манифеста, как:

Manifest-Version: 1.0 
Created-By: 1.7.0_02 (Oracle Corporation) 
Main-Class: bg 

Я в недоумении, потому что мой java-файл работает, но банку нет. Любая помощь будет большой.

+0

Если ваш основной класс помещен под пакетом, укажите его полный абсолютный путь к классу в записи 'Mainif Class' MANIFEST.MF'. Например: если класс 'Bg' находится под пакетом' com.test', полный путь к основному классу - 'com.test.Bg' – ecle

+0

Переименуйте файл manifest.txt в manifest.mf и создайте свой JAR еще раз. – Perception

ответ

0

Возможно, что-то происходит, но откройте банку и подтвердите, что манифест называется manifest.mf (not .txt) и что он находится в каталоге META-INF. Jars - это более или менее zip-файлы, поэтому, если у вас возникли проблемы с открытием, просто добавьте расширение .zip для быстрого и грязного доступа к нему (переименуйте его, когда это будет сделано).

+0

Да, я извлек содержимое фляги, и это действительно файл под названием «MANIFEST.MF» – Izodness

0

Это «правило» Явы, который должен быть имя класса и имя исходного файла совпадают (так class bg должно быть в имени файла bg.java. Вы еще не сделали это таким образом.

BTW, Я не могу понять, как вы получили файл с именем bg.class, поскольку команда javac выводит .class file с тем же, что и базовое имя входного файла .java (в вашем случае blocktestgui.java)

+0

Помните, что файл Java может содержать несколько классов. Компилятор не по умолчанию генерирует имена классов, основанные на имени файла. Однако он требует, чтобы имена открытых классов соответствовали файлу, в котором они содержатся. И что существует только один открытый класс, содержащийся в одном файле. – Perception

+0

Итак, в моем java-файле я изменил свой класс, чтобы он читал «public class Blocktestgui». Он имеет то же имя, что и мой java-файл, поэтому теперь у меня есть Blocktestgui.java и Blocktestgui.class. Когда я скомпилировал, он не дал мне ошибку. Мой новый вопрос: как должен мой манифест читать сейчас? Я очень ценю помощь и быстрые ответы от всех. – Izodness

+0

Вы изменили имя манифеста на manifest.mf? – KevinDTimm

1
  1. по соглашению имена классов должны начинаться с заглавная буква, изменить bg - Bg.
  2. Bg должно быть общедоступным, поэтому изменить определение типа на public class Bg.
  3. Попробуйте выбрать более описательное имя типа, Bg ничего мне не говорит о типе, который он определяет.
+0

как его имя файла 'blocktestgui.java'? – KevinDTimm

+0

Не совсем верно, что его класс 'bg' должен быть общедоступным. Не с JDK 1.5? – Perception

0

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

META-INF/MANIFEST.MF

При создании файла JAR, файл манифеста по умолчанию просто содержит следующее:

Manifest-Version: 1.0 Создано: 1.7.0_06 (Oracle Corporation)

Эти строки показывают, что записи манифеста принимают форму пар «header: value». Имя заголовка отделено от его значения двоеточием. Показатель по умолчанию соответствует версии 1.0 спецификации манифеста и был создан версией JDK версии 1.7.0_06.

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

Смежные вопросы