【问题标题】:Exception - java.lang.NoClassDefFoundError: javax/mail/Authenticator - Only after Compiling my java project异常 - java.lang.NoClassDefFoundError: javax/mail/Authenticator - 仅在编译我的 java 项目之后
【发布时间】:2021-07-14 14:26:33
【问题描述】:

我的程序是一个使用 maven 在 java 11.0.11 上运行的 java 程序。我使用 JAF 和 JavaMail API 以便在按下按钮后在我的代码中发送电子邮件。当我使用 VScode 运行代码时,它可以正常工作,但是当我使用 mvn package 编译它并使用 java - jar recipt_generator-1.jar 运行它并按下应该发送电子邮件的按钮时,它会引发以下异常:

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/mail/Authenticator
        at com.recipt.EndMenu$3.actionPerformed(EndMenu.java:70)
        at java.desktop/java.awt.Button.processActionEvent(Button.java:411)
        at java.desktop/java.awt.Button.processEvent(Button.java:379)
        at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5011)
        at java.desktop/java.awt.Component.dispatchEvent(Component.java:4843)
        at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
        at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
        at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
        at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
        at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
        at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
        at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
        at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.ClassNotFoundException: javax.mail.Authenticator
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 22 more

我尝试更改 maven 编译器版本,添加 javax.mail.jar 和 activation.jar 的依赖项,并检查我使用的每个 jar 是否在类路径环境变量中。 我请求您的帮助,因为我真的很困惑 - 该程序使用 VScode 运行选项完美地发送电子邮件,但是在编译时错误一直显示。 我会给予任何帮助。

【问题讨论】:

  • 你能发布你的maven pom.xml吗?
  • 清理项目也不行吗?试试mvn clean package
  • 非常感谢您创建自己的答案。但请不要把它反映在应该只是一个问题的地方。

标签: java maven exception visual-studio-code compilation


【解决方案1】:

JavaMail 不是 Java API 的一部分。它与 Maven 一起编译,因为您可能将它作为 POM 中的依赖项,并且它位于 Maven 的构建类路径中(而且很可能也在 VSCode 的运行类路径中——我对此并不熟悉)。

仅使用java - jar recipt_generator-1.jar 在命令行上运行它是不够的。如果JavaMail 的JAR 出现以下情况,则必须添加一个(摘自java --help):

   -cp <class search path of directories and zip/jar files>
   -classpath <class search path of directories and zip/jar files>
   --class-path <class search path of directories and zip/jar files>
                 A ; separated list of directories, JAR archives,
                 and ZIP archives to search for class files.

要创建包含 JAR 依赖项的 Fat JAR,请参阅:

【讨论】:

    【解决方案2】:

    感谢您的帮助,我设法弄清楚我错过了应该生成胖 jar 的插件。第二个例子是那个插件。请注意,它仅在附加常规 jar 插件时才对我有用,这是第一个示例。

    第一:

          <plugin>
            <!-- Build an executable JAR -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
              <archive>
                <manifest>
                  <mainClass>com.receiptgen.Main</mainClass>
                </manifest>
              </archive>
            </configuration>
          </plugin>
    

    第二:

    plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.1.1</version>
    
            <configuration>
              <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
              <archive>
                <manifest>
                  <mainClass>com.receiptgen.Main</mainClass>
                </manifest>
              </archive>
            </configuration>
    
            <executions>
              <execution>
                <id>make-assembly</id>
                <phase>package</phase>
                <goals>
                  <goal>single</goal>
                </goals>
              </execution>
            </executions>
    
          </plugin>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 2023-01-13
      相关资源
      最近更新 更多