LoginSignup
2
2

More than 3 years have passed since last update.

java.lang.ClassNotFoundException:となってしまった時の対応方法

Last updated at Posted at 2019-11-16

事象 : java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config

  • 環境
    • CentOS Linux release 7.9.2009 (Core)
    • Apache Tomcat/8.0.21
    • Eclipse IDE for Enterprise Java Developers. Eclipse IDE for Enterprise Java Developers.

さっきまで動いていたのにぃEclipseのワークスペースを切り替えまくっていたらエラーが・・・

重大: Servlet.service() for servlet [FacesServlet] in context with path [] threw exception [javax/servlet/jsp/jstl/core/Config] with root cause
java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
...

原因 : 不明

対応 : Mavenビルド & Tomcatクリーン & プロジェクトクリーン

落ち着いて「Mavenビルド & Tomcatクリーン & プロジェクトクリーン」をしたら動いた・・・GlassFishか!

「jstlを追加する」という対応で治ることもある用だ。
参考 : jsf - java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config - Stack Overflow

事象 : java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtils

  • 環境
    • CentOS Linux release 7.8.2003 (Core)
    • Eclipse IDE for Enterprise Java Developers.Version: 2020-03 (4.15.0)
      • Maven Integration for Eclipse 1.15.0
    • openjdk version "11.0.7" 2020-04-14 LTS
    • JSF 2.3.9
    • Payara Server 5.194

Mavenでライブラリを追加してコードで使ってからアプリケーションを実行してページを表示したらHTTPステータス500になった

Eclipseのコンソールのエラー
javax.el.ELException: /base.xhtml @20,53 rendered="#{!uploadBean.upload}": java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:77)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:170)
...省略...
Caused by: javax.el.ELException: java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:304)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:156)
...省略...
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/lang3/StringUtils
    at brans.UploadBean.isUpload(UploadBean.java:30)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...省略...
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtils
    at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1687)
    at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1528)
    ... 58 more
base.xhtml
...省略...
<!--ここで使っているメソッドでStringUtilsを使っている-->
      <ui:fragment rendered="#{!uploadBean.upload}">
...省略...
UploadBean.java
import org.apache.commons.lang3.StringUtils;
...省略...
    public boolean isUpload() {
        // ここでStringUtilsを使っている
        return StringUtils.isBlank(fileName);
    }
...省略...
pom.xml
...省略...
<!-- Mavenでjarを取ってきている -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.11</version>
</dependency>
...省略...

原因と対応 : 不明

jarにclassファイルはあった・・・何が問題?

$ jar -tf .m2/repository/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar | grep StringUtils
org/apache/commons/lang3/RandomStringUtils.class
org/apache/commons/lang3/StringUtils.class

試してダメだったこと1. 再度Mavenビルド & クリーン

  1. .m2/repository/org/apache/commons/commons-lang3ディレクトリを削除
  2. Mavenビルド
  3. デプロイされているプロジェクトを削除してクリーン
  4. プロジェクトをクリーン & Payaraに再度デプロイ

試してダメだったこと2. commons-langの2.6とcommons-lang3の3.1をpom.xmlに追加

  1. pom.xmlに以下定義を追記
  2. Mavenビルド
  3. デプロイされているプロジェクトを削除してクリーン
  4. プロジェクトをクリーン & Payaraに再度デプロイ
  <dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
  </dependency>
  <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.1</version>
  </dependency>

事象 : java.lang.ClassNotFoundException: org.objectweb.jotm.TransactionFactoryImpl_Stub

  • 環境
    • CentOS Linux release 7.6.1810 (Core)
    • Eclipse 2019-03 (4.11.0)
    • Java1.6.0_41
    • Apache Maven 3.2.5

EclipseでTomcatを起動したら怒られた

[Consol]タブのログ
2020-04-17 10:32:34.216 ERROR                                   Jotm.<init>:144 - Instanciation of TransactionFactory failed
java.rmi.StubNotFoundException: Stub class not found: org.objectweb.jotm.TransactionFactoryImpl_Stub; nested exception is: 
    java.lang.ClassNotFoundException: org.objectweb.jotm.TransactionFactoryImpl_Stub
...省略...
    at org.objectweb.jotm.Jotm.<init>(Jotm.java:140) ~[jotm-2.0.10.jar:"2.0.9"]
    at org.springframework.transaction.jta.JotmFactoryBean.<init>(JotmFactoryBean.java:95) ~[spring-dao-2.0.8.jar:2.0.8]
...省略...
Caused by: java.lang.ClassNotFoundException: org.objectweb.jotm.TransactionFactoryImpl_Stub
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1698) ~[catalina.jar:6.0.53]
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1544) ~[catalina.jar:6.0.53]
    at java.lang.Class.forName0(Native Method) ~[na:1.6.0_41]
    at java.lang.Class.forName(Class.java:274) ~[na:1.6.0_41]
    at sun.rmi.server.Util.createStub(Util.java:286) ~[na:1.6.0_41]
    ... 85 common frames omitted

ログにjotm-2.0.10.jarと表示されているが、プロジェクトのpom.xmlに定義しているのはjotm-2.1.1.pomなので不思議に思った。

プロジェクトのpom.xml
<dependency>
  <groupId>org.ow2.jotm</groupId>
  <artifactId>jotm</artifactId>
  <version>2.1.1</version>
  <type>pom</type>
  <exclusions>
...省略...
</dependency>
...省略...
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-dao</artifactId>
    <version>2.0.8</version>
</dependency>
...省略...

ログのjotm-2.0.10.jarの下にspring-dao-2.0.8.jarがあるのでspring-dao-2.0.8.pomを見てみると、「あった!」

spring-dao-2.0.8.pomを見てみる
$ cat ~/.m2/repository/org/springframework/2.0.8/spring-dao-2.0.8.pom
...省略...
<dependency>
  <groupId>jotm</groupId>
  <artifactId>jotm</artifactId>
  <version>2.0.10</version>
  <optional>true</optional>
</dependency>
...省略...

原因 : プロジェクトのpom.xmlで定義しているjarの依存関係の先にあるクラスがないから

spring-dao-2.0.8.pom が使う jotm-2.0.10.jar が使う org.objectweb.jotm.TransactionFactoryImpl_Stub がないことが原因

対応方法 : 依存関係の先にあるクラスを含むjarをpom.xmlに定義する

  1. JAR Search - findJAR.comで、org.objectweb.jotm.TransactionFactoryImpl_Stubがなんていうjarに含まれるかを検索する
  2. 検索で判明したjotm-jrmp-stubsMaven Repository: Search/Browse/Exploreで検索する
  3. プロジェクトのpom.xmlに定義を追加する
プロジェクトのpom.xml
...省略...
<dependency>
    <groupId>jotm</groupId>
    <artifactId>jotm_jrmp_stubs</artifactId>
    <version>2.0.10</version>
</dependency>
...省略...

事象 : java.lang.ClassNotFoundException: org.jboss.util.NullArgumentException

  • 環境
    • Windows10 Pro 64bit
    • GlassFish Server Open Source Edition 4.1 (build 13)
    • Java version 1.8.0_231
    • Eclipse Version: Oxygen.3a Release (4.7.3a)

GlassFishを起動しようとしたら怒られた

エラーダイアログのメッセージ
cannot Deploy プロジェクト名
deploy is failing=Error occurred during deployment: Exception while loading the app : CDI deployment failure:org/jboss/util/NullArgumentException. Please see server.log for more details.
server.log
[2019-11-13T17:39:04.980+0900] [glassfish 4.1] [SEVERE] [] [javax.enterprise.system.core] [tid: _ThreadID=48 _ThreadName=admin-listener(5)] [timeMillis: 1573634344980] [levelValue: 1000] [[
  Exception while loading the app : CDI deployment failure:org/jboss/util/NullArgumentException
java.lang.NoClassDefFoundError: org/jboss/util/NullArgumentException
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2615)
...省略...
Caused by: java.lang.ClassNotFoundException: org.jboss.util.NullArgumentException
    at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1783)
    at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1633)
...省略...

原因 : プロジェクトにないクラスを使っているから

理由あって何でもいいから例外を発生させたくて適当に補完で出た例外を書いたらプロジェクトには存在しない例外でした・・・。

import org.jboss.util.NullArgumentException;
...省略...
                //                return hoge();
                throw new NullPointerException();
...省略...

対応 : プロジェクトにないクラスは削除する

「削除する」「入れる」「作る」のいずれかで対応します。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2