2010-09-22 2 views
4

У меня есть проект в NetBeans6.9.1. Он отлично работает изнутри IDE. Но когда я пытаюсь запустить банку, этот NetBeans автоматически создается под каталогом dist, я получаю NoClassDefFoundError для классов внутри моего проекта. Что я делаю не так? Должен ли я использовать Ant или что-то (не знаю Ant) В eclipse я делаю «создать runnable jar», и jar работает без проблем. Есть ли что-то эквивалентное в NetBeans?java runnable jar from netbeans 6.9.1

UPDATE: В dist/myJar я извлекал банку, а в манифесте отсутствовал текущий путь и корневой путь моего проекта. Я добавил их вручную и повторно создал банку из командной строки. И это работает. Но почему NetBeans не добавляет их в classpath манифеста jar. Я не понимаю

UPDATE 2 Я нашел проблему. Я думаю, что это серьезная ошибка NetBeans. Я сделал рефакторинг и изменил имена пакетов от myPackage.model до mypackage.model. Но NetBeans не делал это правильно. Он действительно изменил имя пакета на mypackage, как показано в навигаторе дерева, но имя пакета внутри файла осталось как myPackage. Программа выполнена нормально внутри IDE, и никаких ошибок не сообщалось (хотя все классы объявлялись как принадлежащие к моей статье P, а в дереве они находились под моим p ackage), но когда я попытался запустить банку внутри каталога dist я получил исключение класса, не найденное. Сегодня я заметил, что класс был указан как мой P ackage/model вместо моего p ackage/model. Я заглянул в классы, и рефакторинг полностью закрепил все. Я вручную изменил имя пакета изнутри своих классов из myPackage в mypackage и исправил все импортные (которые импортировали myPackage). Это известная проблема NetBeans ????

Благодаря

ответ

6

С NetBeans ваш проект Java будет либо Maven или Ant основе. То, что вы хотите сделать, - создать «жирную» банку, в которую включены все ее зависимости. Для Maven вы можете добавить следующие строки в ПОМ на accomlish что:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <configuration> 
     <archive> 
      <manifest> 
       <mainClass>package.and.MainClass</mainClass> 
      </manifest> 
     </archive> 
    </configuration> 
</plugin> 

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>1.2.1</version> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Так Maven это двухступенчатый вещь:

  • Вы должны сказать Maven, чтобы произвести «затененных» (в том числе зависимостей) банка,
  • и вы должны указать главный класс (тот, содержащий метод static main(..) для запуска.

Если вы используете Ant вы можете захотеть иметь выглядеть this blog post.

+0

Итак, с NetBeans я ДОЛЖЕН иметь знания о работе Ant или Maven ??? Потому что я не знаю ни того ни другого. И почему classpath в манифесте NetBean опускает текущий каталог и корневой файл проекта? – Cratylus

+0

@ user384706 На самом деле я думаю, что поддержка Netbeans Maven очень хороша, но на самом деле некоторые знания об этом действительно помогают. Я думаю, что перенос текущего каталога в манифест .jar очень хрупок, поэтому лучше просто не делать этого. И если с «корневым файлом проекта» вы имеете в виду класс «основной» класс, может быть больше одного, и вместо того, чтобы угадывать, что неправильный NB вообще не догадывается. Все плюсы и минусы этого спорны, но вот что это такое. :-) – Waldheinz

1

У меня был такой же пролет, и все, что я могу сказать, это то, что он кажется сбой с NetBeans 6.9.1, поскольку он работал в 6.8 и 6.9.

Для удобства вы можете открыть его в WinZip или WinRar и просто изменить файл манифеста оттуда, не используя его самостоятельно. Это то, что я делаю.

+1

Открываем с помощью WinZip.Open Manifest и открываем текстовым редактором. Измените файл манифеста. Закройте и замените его обновленным архивом. Нажмите «да», но новый архив сохранил старый файл манифеста в «META-INF» и разместил мой новый манифест вне META-INF. Вы столкнулись с этим? – Cratylus

+0

Нет, я не ... Это довольно странно. Вы сохраняете или сохраняете как? Пока вы просто открываете манифест, отредактируйте его (желательно в Блокноте) и сохраните его, он должен работать. – Supuhstar

0

NetBeans создает самодостаточный JAR-файл для вашего проекта при выполнении команды «Очистить и построить» из меню или кнопки инструмента.

В идеале путь класса Jar-файла не должен содержать корневую папку проекта, NetBeans добавляет библиотеку JARS, если вы добавили их в проект в свойстве Class-Path в файле manifest.mf автоматически.

Если у вас есть пользовательские требования, вы можете даже изменить файл manifest.mf, который входит в состав встроенного JAR. Файл manifest.mf доступен на панели «Файлы» в корневом каталоге проекта.

Для создания JAR-исполняемого файла с помощью команды java -jar вы должны указать основной класс в конфигурации проекта. (Если проект был создан с помощью мастера проекта NetBeans, то этот класс уже определен, в противном случае мы должны сделать это вручную)

Укажите основной класс через опцию меню следующим образом:

File > Project Properties > Run (Category) > Main Class (textbox) 

Пожалуйста, подробно изложите ваш проект, как

  1. Является ли проект создан из мастера создания проекта NetBeans?
  2. Является ли проект основанным на основе муравьев или основанием Maven?
  3. Проект проекта свободной формы, созданный из существующего источника?

Эта дополнительная информация поможет мне ответить на вопрос в деталях. Надеюсь, это помогло.

касаемо
Tushar

+0

Проект был создан из мастера. Я не использовал Ant и Maven, если только не существует некоторого параметра конфигурации, который я не знаю. Это приложение для качания. Основной класс определен в манифесте. Структура - это src/myPackage1/model, src/myPackage1/controller и т. Д. Я не вижу ошибки класса для класса в myPackage1.model – Cratylus

+0

Если проект создан из мастера, он по умолчанию основан на Ant и главном классе проекта автоматически настраивается как основной класс в конфигурации запуска. У вас есть определенная структура библиотеки?У вас есть папка lib, определенная отдельно для библиотечных JAR? –

+0

Все мои классы принадлежат пакетам. Я использую дополнительные банки, которые NetBeans поместил их в каталог /libs.The "class not found exception" относится не к этим дополнительным банкам в каталоге lib, а к классу в моих пакетах. например файловая структура MyProject/src/является моей исходной папкой. В соответствии с этим: ui_swing/models, ui_swing/controller и т. Д. Для соответствующих пакетов. Я получаю класс, не найденный для класса ui_swing.models.myModel в разделе MyProject/src/ui_swing/models. Я не понимаю, что не так. Он должен иметь возможность найти класс с манифестом по умолчанию. Правильно? – Cratylus

1

Я решил после этого post in an external blog:

Вы должны добавить два плагина (maven-assembly-plugin и maven-jar-plugin) в build части вашего файла pom.xml. Вы строите секцию, которая будет похожа на это:

<build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.3.2</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <version>(select version, i.e: 2.3)</version> 
        <executions> 
        <execution> 
         <goals> 
         <goal>attached</goal> 
         </goals> 
         <phase>package</phase> 
         <configuration> 
         <descriptorRefs> 
          <descriptorRef>jar-with-dependencies</descriptorRef> 
         </descriptorRefs> 
         <archive> 
          <manifest> 
          <mainClass>your.main.Class</mainClass> 
          </manifest> 
         </archive> 
         </configuration> 
        </execution> 
       </executions> 
       </plugin> 
       <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-jar-plugin</artifactId> 
       <version>(select version, i.e: 2.3.2)</version> 
        <configuration> 
        <archive> 
         <manifest> 
         <addClasspath>true</addClasspath> 
         <mainClass>your.main.Class</mainClass> 
         </manifest> 
        </archive> 
       </configuration> 
       </plugin>       
     </plugins> 
    </build> 
Смежные вопросы