2014-07-09 3 views
0

tomcat7 및 oracle jdk 8을 실행중인 테스트 용 Ubuntu 서버가 있습니다. 향후 다양한 프로그램에 필요한 몇 개의 jar 파일을로드하려고합니다. 웹과 jvm 프로그램. 나는 서버 백그라운드 프로세스로 실행됩니다 항아리의 테스트 실행을했을 때 문제가 있음을 깨달았지만 실행했을 때 다음과 같은 오류 얻을 : 나는 내 단지를 추가 한Tomcat 7/Java 8 ClassNotFoundException

Exception in thread "main" java.lang.NoClassDefFoundError: edu/illinois/sql/sqlConnection 
    at server.edu.illinois.xmlConverter.convertXML.run(Converter.java:27) 
    at server.edu.illinois.xmlConverter.Converter.main(Converter.java:13) 
Caused by: java.lang.ClassNotFoundException: edu.illinois.sql.sqlConnection 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 2 more 

을 내/shared/lib에있는 클래스와 catalina.properties는 거기를보고 $ JAVA_HOME/jre/lib에 심볼릭 링크가 있습니다. 서버에있는 내 jar 파일의 사용자 정의 클래스가 제대로로드되지 않는 이유는 누구에게 조언이 있습니까? 또한 오류를 생성하기 위해 실행 한 jar는 Eclipse에서 뛰어납니다.

내 항아리가 올바른 위치에 있다고 믿고이 클래스가로드되지 않게 만드는 잘못된 점을 파악하려고하기 때문에 이것은 다른 질문 인 ClassNotFoundException/NoClassDefFoundError in my Java web application입니다.

+0

질문이 수정되었습니다 – nfeuerhelm

+0

왜 이러한 클래스를 포함하고있는 대신 자체 포함 된 WAR를 만들지 않습니까? –

+0

.WAR과 .JAR 모두에 필요한 클래스가 있기 때문에. 자체 포함 된 .WAR은 웹 응용 프로그램의 문제를 해결할 수 있지만 독립형이 아닙니다 .JAR. – nfeuerhelm

답변

0

JVM 설치를 수정하지 마십시오. 그럴 가치가 없습니다.

실행 JAR 파일과 같은 독립 실행 형 프로그램에 대한
  • 이, 웹 응용 프로그램
  • this answer를 참조 WEB-INF/lib에 배치 : 프로그램과 함께 JAR 파일을 번들하는 잘 알려진 방법이 있습니다. 메이븐 (Maven)은 당신을 위해 그것을 할 것입니다.

예, 동일한 JAR이 복제됩니다. 아니, 정말 괜찮아. 예, 약간의 오버 헤드가 있습니다. 그렇습니다. 수정 된 JVM과 수정 된 JVM은 정말 가치가 있습니다. 자동으로 업데이트 된 후 갑자기 내 개발 컴퓨터가 클래스를 찾지 못하는 이유를 찾기 위해 5 시간을 낭비하게합니다.

0

아직 충분히 설명하지 않았을 지 모르지만 저는 아직 자바를 처음 접하고 스스로 가르칩니다. 그러나 나는 내 대답을 알아 냈다. Tassos와 Thorbjørn은 내가 특히 염두에 두어야 할 좋은 점을 말하며, 특히 /jre/lib이나 으로 어지럽지 않습니다. 그러나 실행 가능한 항아리에 외부 항아리를 묶고 싶지 않기 때문에 서버를 실행하고 항아리를 만드는 중일 때 저에게 맞는 솔루션을 발견했습니다.

사용자 지정 MANIFEST.MF을 추가 할 예정입니다. 여기에는 Class-path: 문을 사용하여 공통 항아리를 넣는 디렉터리를 가리 킵니다. 예를 들어

: 내가 한 번만 필요로하는 외부 항아리를 포함하고 내가 매니페스트의 항아리를 업데이트 할 때 이클립스에 필요 아무것도를 업데이트 할 수 있습니다

Manifest-Version: 1.0 
Main-Class: server.edu.illinois.Main 
Class-Path: /shared/lib/guava-17.0.jar /shared/lib/jcifs-1.3.17.jar /shared/lib/mysql-connector-java-3.1.14-bin.jar 

이 방법. 나는 공통 클래스로드를 할 때 그 라이브러리의 jar 파일을 픽업하도록 여전히 tomcat을 남겨 둘 수 있습니다. 내일 내 dev 머신으로 돌아 가면 /jre/lib/ext에서 심볼릭 링크를 꺼낼 것입니다.

전반적으로 클래스 로더가보고있는 경로에 실제로 있지 않았기 때문에 내 Jar 파일이 제대로로드되지 않았습니다. 오버 헤드를 추가하지 않고이 문제를 해결하기 위해 이것들은 하나의 프로그램이 될 것이기 때문에 catalina의 공용 클래스 로더에 디렉토리를 추가하고 독립 실행 형 프로그램의 매니페스트에 jar 경로를 추가합니다.

+0

답변을 작성하는 대신 질문을 편집하십시오. –

+0

도움말 페이지에서 제안하는 내용을 수행하고있었습니다. http://stackoverflow.com/help/self-answer – nfeuerhelm

+0

질문이 실제로 _ 답변 인 경우에만 해당됩니다. –

관련 문제