当前位置: 首页 > 知识库问答 >
问题:

NoClassDefFoundError仅在通过命令行运行代码时发生

敖涵容
2023-03-14

当我通过命令行运行此代码时,我得到了一个异常。当我通过Eclipse IDE运行它时,它运行得很好,没有异常。我不知道发生了什么,但它肯定在会话语句中得到了异常。

public static void sendEmail(String sendFile) {
    // Send the log file via email.
    final String username = "firstname.lastname@mycompany.com";
    final String password = "myPassword";

    // Strings that contain from, to, subject, body and file path to the attachment.
    String from = username;
    String to = username;
    String subject = "Baggage URL failures - Please check";
    String body = "FareDB Bad URL(s) Report. The following URL(s) could not be loaded...";
    String filename = sendFile;
    System.out.println("Mail header info set!");

    // Set smtp properties
    Properties properties = new Properties();
    properties.put("mail.smtp.starttls.enable", "true");
    properties.put("mail.smtp.auth", "true");
    properties.put("mail.smtp.host", "smtp.gmail.com");
    properties.put("mail.smtp.port", "587");
    System.out.println("SMTP properties set!");

    Session session = Session.getInstance(properties, null);
    System.out.println("Mail session declared!");

    try {
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        // Just me for testing
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(username));
        message.setSubject(subject);
        message.setSentDate(new Date());
        System.out.println("Mail body info set!");

        // Set the email body
        MimeBodyPart messagePart = new MimeBodyPart();
        messagePart.setText(body);
        System.out.println("Mime message body set!");

        // Set the email attachment file
        MimeBodyPart attachmentPart = new MimeBodyPart();
        FileDataSource fileDataSource = new FileDataSource(filename) {
            @Override
            public String getContentType() {
                return "application/octet-stream";
            }
        };
        attachmentPart.setDataHandler(new DataHandler(fileDataSource));
        attachmentPart.setFileName(fileDataSource.getName());
        System.out.println("Mail attachment info set!");

        // Add all parts of the email to Multipart object
        Multipart multipart = new MimeMultipart();
        multipart.addBodyPart(messagePart);
        multipart.addBodyPart(attachmentPart);
        message.setContent(multipart);
        System.out.println("Mail parts added!");

        // Send email
        Transport.send(message);
        System.out.println("Mail sent!");
    } catch (MessagingException e) {
        e.printStackTrace();
    }
}

我得到的错误仅当它在命令行运行时:

 Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger
    at javax.mail.Session.initLogger(Session.java:221)
    at javax.mail.Session.<init>(Session.java:206)
    at javax.mail.Session.getInstance(Session.java:242)
    at VerifyUrl.sendEmail(VerifyUrl.java:186)
    at VerifyUrl.main(VerifyUrl.java:50)
 Caused by: java.lang.ClassNotFoundException: com.sun.mail.util.MailLogger
    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)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 5 more

你知道这是什么原因吗?

共有2个答案

慎峻
2023-03-14

这是一个类路径问题,也是使用javax时的问题。邮件而不是javax。邮件api。

问题现在解决了。

琴琪
2023-03-14

这是java开发人员面临的最常见问题。

>

  • 其中java具有包结构机制
  • 要运行任何使用其他包类/接口/枚举的java程序,需要将其导入到类中
  • 如果您使用的是外部库或其他包,那么您需要在您的案例中为该类设置类路径。太阳邮政util。邮件记录器
  • 像eclipse和IntellijIdea这样的IDE为您打包和设置类路径
  • 如果您试图运行上述程序或任何其他程序,可以遵循以下语法

    java-cp /relative_path_to_your_dependency_jars类名称

    在你的情况下是这样的。

    java-cp/downloadpath/javax。mail-1.5.0。jar YouMainClass

    类似于编译类

    java-cp/downloadpath/javax。mail-1.5.0。jar YouMainClass。java

  •  类似资料:
    • 我刚刚使用IntelliJ完成了一个相当大的项目,并说我会为没有IDE的人提供命令行语句来运行它(该项目将由不同的人在不同的机器上运行)。我有一段时间没有使用命令行了,所以我有点生疏了。我得到了一个NoClassDefFoundError:错误的名称,我一直在研究关于S/O的问题,比如为什么我在Java中得到NoClassDefFoundError?但这些似乎不能解决我的问题。我使用了相当多的外部

    • 问题内容: 我有一个应用程序,该应用程序应该使用一些shell命令将文件从sdcard复制到/ system / media /。它将需要root用户,并且我正在对root用户的设备进行测试。我正在使用运行时来执行Shell命令,但无法正常工作。这是我的运行时所需要的 但是我的日志只显示其中两个没有被拒绝 这两个看起来是sysrw和sysro命令,但是当我触发此代码时,该应用程序仍会请求root权

    • 问题内容: 我有一个Java程序,正在使用 mysql* 数据库连接代码。我在Eclipse的资源文件夹中添加了 mysql-connector- java-3.0.10-stable-bin.jar 和 mysql-connector-java-5.0.4-bin.jar 文件。当我在Eclipse中运行程序时,它运行良好。然后,我创建了一个项目的 .jar 文件,其中包含该jar文件中的所有j

    • 一些注意事项: 1。我最初使用的TestNG jar来自java项目中的maven repo。下面的所有方法都是用maven testNG jar和新的TestNG6.9.12下载进行测试的。 2。我可以从Eclipse中运行这个文件。只有当我尝试从命令行运行时才有问题。 3。最终目标是通过javafx应用程序按钮触发命令行来运行测试。如果提供的解决方案避免在cmd中键入绝对路径,因为应用程序将在

    • 问题内容: 我发现了几个用于通过Java类运行cmd命令的代码段,但我无法理解。 这是打开cmd的代码 我找到了一些其他链接来添加其他命令,例如cd http://www.coderanch.com/t/109753/Linux-UNIX/exec-command-cd-command-java 如何使用Java打开命令提示符并插入命令? 谁能帮助我了解如何CD目录,例如: 然后在该目录上运行其他

    • 我找到了几个通过Java类运行cmd命令的代码片段,但我无法理解。 这是打开命令的代码 我还找到了一些添加其他命令的链接,比如cdhttp://www.coderanch.com/t/109753/Linux-UNIX/exec-command-cd-command-java 如何使用Java打开命令提示符并插入命令? 有人能帮我了解如何cd目录,例如: 然后在该目录上运行其他命令?