Атрибут манифеста для java jar

С вашей помощью я смог закончить свой первый проект на Java. Теперь я хочу создать банку и запустить приложение (Java-проект — это простое консольное приложение, у которого есть другой проект (консольное приложение) в качестве зависимости) из банки.

Я создал банку с eclipse, щелкнув правой кнопкой мыши - экспортировать - создал банку. Когда я пытаюсь запустить эту банку из своего cmd, у меня возникает ошибка (ниже я получаю сообщение об ошибке)

no main manifest attribute, in AAA.jar

Я погуглил ошибку - большинство из них подвергается созданию файла манифеста. Я создал файл манифеста, как показано ниже, в проекте, равном уровню src.

Manifest-Version: 1.0
Main-Class: com.Pacakename.mainclass
Class-Path: log4j-1.2.16.jar db2jcc.jar db2jcc_license_cu.jar

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

Пожалуйста, кто-нибудь, пожалуйста, объясните четкий шаг для создания манифеста (мне действительно поможет, если вы покажете мне структуру папок того места, где у нас есть файл манифеста)


person tom    schedule 13.06.2013    source источник


Ответы (3)


Предположим, у вас есть следующая структура каталогов:

MyJavaProject
   |-src 
      |- com
          |- example
               |- Main.java

Чтобы скомпилировать такой проект в строке cmd (без внешних зависимостей), вам нужно вызвать команды

$ cd MyJavaProject
$ mkdir bin         //to separate *.class file from source files
$ javac -d bin src\com\example\Main.java

Это создаст файл Main.class в каталоге bin. Чтобы запаковать его в файл *.jar, вы можете: 1) создать jar с бинарными файлами и указать класс Main в cmd 2) создать Manifes и встроить его в jar (я остановлюсь на этом)

Вы должны создать каталог META-INF под src и внутри него создать файл MANIFEST.mf

Ваш манифест должен выглядеть так:

Manifest-Version: 1.0
Created-By: <Your info>
Main-Class: com.example.Main

Не забудьте добавить пустую строку в конце манифеста!!

В этом случае вы указываете атрибут Manifest-Version, атрибут Created-By и полное имя основного класса для запуска в атрибуте Main-Class.

Чтобы создать Jar с этим файлом манифеста и вашим двоичным файлом, вызовите команды

$ cd bin
$ jar cfm MyJavaProject.jar ..\src\META-INF\MANIFEST.MF .

это создаст новую банку с именем MyJavaProject.jar и будет использовать ваш манифест

Если ваш проект зависит от внешних классов или jar, добавьте их в свой путь к классам при компиляции (опция -cp) и добавьте еще одну строку в Manifest

ClassPath: path/to/dependent/jars/jar.jar

Перекомпилируйте его, создайте новый jar и наслаждайтесь своим Java-квестом :)

Дополнительные сведения о манифесте см. в документах.

PS: Работа с банками, amnifest из строки cmd может показаться уродливой, но она может научить вас некоторым концепциям, подобным аве. Если вы хотите пропустить его, рассмотрите возможность использования Apache Maven или Апачский муравей

person Filip Zymek    schedule 13.06.2013
comment
Что вы так много мне объяснили так ясно, читая ваш ответ, я понимаю несколько тем, которые я собираюсь реализовать выше с помощью моего cmd. - person tom; 14.06.2013
comment
Это сработало - :), я смог сгенерировать банку и запустить ее, еще раз спасибо - person tom; 14.06.2013

Если вы используете maven, я могу порекомендовать вам использовать < em>shade plugin для создания исполняемых jar-файлов со всеми зависимостями (и манифестами :-)) на борту.

Включите это в свой pom.xml:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.1</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <!-- your main class: -->
                  <mainClass>org.sonatype.haven.HavenCli</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

Затем выполните mvn clean package shade:shade, чтобы создать банку, которую можно запустить из командной строки с помощью java -jar jarfilename.jar.

person tbsalling    schedule 13.06.2013
comment
Нет, я не использую его, Maven не одобрен на моем рабочем месте - :(, Пожалуйста, предложите мне, как это сделать без использования Maven - person tom; 14.06.2013
comment
Вы используете обычное затмение? Или IBM-ified версия (RAD)? - person tbsalling; 14.06.2013

Если вы используете eclipse, вы можете использовать «Экспорт» -> Runnable jar для достижения своих целей. В этом случае у вас должна быть действительная конфигурация запуска для вашего проекта, поскольку eclipse использует эту конфигурацию запуска в качестве своего рода плана для исполняемого jar-файла.

В этом случае eclipse создаст для вас манифест.

person mschenk74    schedule 13.06.2013
comment
Вместо использования Export --› Runnable jar в Eclipse я предпочитаю использовать Maven pom.xml для определения моей исполняемой сборки .jar. Очевидно, для этого требуется установить плагин M2E Maven для Eclipse. - person djangofan; 14.06.2013
comment
@djangofan Но способ maven объяснить здесь сложнее. В своей повседневной работе я также использую maven, ant или gradle в сочетании с системами сборки для создания jar-файлов. На мой взгляд, производственные версии никогда не должны создаваться на рабочей станции, только на специальной системе сборки. - person mschenk74; 14.06.2013
comment
@mschenk74 mschenk74 я пробовал так же, как вы сказали, но когда я пытаюсь запустить этот хар, я все равно получаю то же сообщение об ошибке Нет атрибута манифеста - person tom; 14.06.2013