Проблема загрузки файлов из jar (проблема с classpath) - PullRequest
1 голос
/ 23 августа 2011

Когда я пытаюсь выполнить этот код: package uk.org.infectogenomics.agent;

import uk.org.infectogenomics.Agent.qa.Quasr;

public static void main(String[] args) {
//ommited some code
Runnable step = new Quasr(wf.getStepByPos(1));
}

Я получаю:

Exception in thread "main" java.lang.NoClassDefFoundError: uk/org/infectogenomic
s/Agent/qa/Quasr
at uk.org.infectogenomics.agent.Agent.main(Agent.java:55)
Caused by: java.lang.ClassNotFoundException: uk.org.infectogenomics.Agent.qa.Quasr
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

Вот мой файл манифеста:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.2
Created-By: 1.6.0_25-b06 (Sun Microsystems Inc.)
Class-Path: lib/mysql-connector-java-5.1.17-bin.jar lib/aws-java-sdk-1.2.6.jar
X-COMMENT: Main-Class will be added automatically by build
Main-Class: uk.org.infectogenomics.agent.Agent

И вот список самого файла jar:

META-INF/
META-INF/MANIFEST.MF
uk/
uk/org/
uk/org/infectogenomics/
uk/org/infectogenomics/agent/
uk/org/infectogenomics/agent/Assembly/
uk/org/infectogenomics/agent/hostEl/
uk/org/infectogenomics/agent/qa/
uk/org/infectogenomics/agent/taxonomy/
uk/org/infectogenomics/agent/Agent.class
uk/org/infectogenomics/agent/Assembly/Newbler.class
uk/org/infectogenomics/agent/Assembly/Velvet.class
uk/org/infectogenomics/agent/DBAccessor.class
uk/org/infectogenomics/agent/DateUtils.class
uk/org/infectogenomics/agent/Status$1.class
uk/org/infectogenomics/agent/Status$2.class
uk/org/infectogenomics/agent/Status$3.class
uk/org/infectogenomics/agent/Status$4.class
uk/org/infectogenomics/agent/Status.class
uk/org/infectogenomics/agent/Workflow.class
uk/org/infectogenomics/agent/WorkflowStep.class
uk/org/infectogenomics/agent/agent.properties
uk/org/infectogenomics/agent/hostEl/Fastq2FQone.class
uk/org/infectogenomics/agent/hostEl/RepeatMasker.class
uk/org/infectogenomics/agent/hostEl/SplitFiles.class
uk/org/infectogenomics/agent/qa/Quasr.class
uk/org/infectogenomics/agent/taxonomy/Phymbl.class

Итак, каким должен быть classpath, и поскольку я использую Netbeans, я бы предположил, что это работа IDE пона самом деле позаботиться об этом.Это происходит только тогда, когда я упаковываю все в jar, когда я запускаю код из IDE, все работает как положено.

1 Ответ

4 голосов
/ 23 августа 2011

Посмотрите на имя класса, которое он не может найти:

uk/org/infectogenomics/Agent/qa/Quasr

Теперь посмотрите на содержимое вашего jar-файла:

uk/org/infectogenomics/agent/qa/Quasr.class

Есть разница в обсадной колонне. Мое предположение заключается в том, что в какой-то момент вы переключили имя пакета с нижнего регистра (который должен , IMO), но вы в Windows (с нечувствительным к регистру файлом system), поэтому существующий каталог «агент» был сохранен, а не удален и заменен на «Агент».

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

...