简体   繁体   English

Java applet RuntimeException:java.lang.NoClassDefFoundError:javax / mail / Authenticator

[英]Java applet RuntimeException: java.lang.NoClassDefFoundError: javax/mail/Authenticator

I have written my first java applet and get errors when deploying it on my web server. 我编写了我的第一个Java applet,并在我的Web服务器上部署它时遇到错误。 My applet uses couple of additional jar files like javaMail mail.jar , smtp.jar , mailapi.jar and others. 我的applet使用了几个额外的jar文件,比如javaMail mail.jarsmtp.jarmailapi.jar等。 When I try to display my applet in web browser I get such info in Error Dialog: 当我尝试在Web浏览器中显示我的applet时,我在错误对话框中获得了这样的信息:

java.lang.RuntimeException: java.lang.NoClassDefFoundError: javax/mail/Authenticator
..
Caused by: java.lang.NoClassDefFoundError: javax/mail/Authenticator
    ... 20 more

I am not very good with web applications and not sure what causes this error. 我对Web应用程序不是很好,也不确定导致此错误的原因。 From the info I assume that my applet cannot load the libraries. 从信息我假设我的applet无法加载库。 So how can I solve this? 那我怎么解决这个问题呢? I have those libraries on my server in /lib directory. 我在/ lib目录下的服务器上有这些库。 All other files are in main directory. 所有其他文件都在主目录中。 My HTML file is as follows: 我的HTML文件如下:

<HTML>
<HEAD>
   <TITLE>TPSA Speed Test</TITLE>
</HEAD>
<BODY>
<P>
<APPLET code="speedtester_pkg/AppletMain.class" archive="SpeedTester.jar" width=440     height=600></APPLET>
</P>
</BODY>
</HTML>

I also tried to load my applet to web browser using JNLP with the same effect. 我还尝试使用JNLP将我的applet加载到Web浏览器,效果相同。 I tried to find some way to point those libraries in HTML file, but I didn't manage (tried to add another jar archive lines or nativelib in JNLP file). 我试图找到一些方法将这些库指向HTML文件,但我没有管理(试图在JNLP文件中添加另一个jar存档行或nativelib )。 I also tried to add those libraries to jar file with my applet classes, but that didn't help either. 我还试图用我的applet类将这些库添加到jar文件中,但这也无济于事。

This is my code where I use javaMail (sendTestResults() method near end of the code): 这是我的代码,我在代码的末尾使用javaMail(sendTestResults()方法):

/*
 * AppletMain.java
 */
package speedtester_pkg;

import java.awt.*;
import java.beans.*;
import java.io.*;
import java.util.*;
import java.util.logging.*;
import javax.swing.*;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class AppletMain extends javax.swing.JApplet implements PropertyChangeListener{

private ArrayList<String> customerFields;
private DataReader dataReader;
private Test test;
private FileHandler fh;
private ProgressBarTask progressBarTask;
private JTextField[] customerData;
private String speed, cpuLoad, NICspeed, testTime;
private int timeDef = 60;
    /**
 * The input file directory
 */
//    public String directory = "C:\\Documents and Settings\\Administrator\\Pulpit\\";
public String filename = "speedtestData.txt";
/**
 * Input file should be  a simple "*.txt" file named "speedtestData.txt"
 */
public File file;
// mail sending data
/**
 * TO DO encrypt mailing data
 */
private String smtpHost = "smtp.gmail.com",
        username = "myUserName",
        password = "myPassword";

private int port = 465; // TLS 587/ SSL 465


/** Initializes the applet Applet */
@Override
public void init() {
    try {
        java.awt.EventQueue.invokeAndWait(new Runnable() {
            public void run() {
                createGUI();
            }
        });
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

/** This method is called from within the init() method to
 * initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is
 * always regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    infoPanel = new javax.swing.JPanel();
    labelLogo = new javax.swing.JLabel();
    labelTitle = new javax.swing.JLabel();
    labelLinkSpeed = new javax.swing.JLabel();
    labelProcessorLoad = new javax.swing.JLabel();
    labelNIC = new javax.swing.JLabel();
    buttonStart = new javax.swing.JButton();
    jLabel4 = new javax.swing.JLabel();
    jLabel5 = new javax.swing.JLabel();
    jLabel6 = new javax.swing.JLabel();
    jProgressBar = new javax.swing.JProgressBar();
    formPanel = new javax.swing.JPanel();
    jLabel8 = new javax.swing.JLabel();
    buttonSend = new javax.swing.JButton();
    labelForm = new javax.swing.JLabel();
    infoLabel = new javax.swing.JLabel();
    jScrollPane = new javax.swing.JScrollPane();
    commentText = new javax.swing.JTextArea();

    labelTitle.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
    labelTitle.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    labelTitle.setText("Link Speed Test");

    labelLinkSpeed.setFont(new java.awt.Font("Tahoma", 1, 24)); // NOI18N
    labelLinkSpeed.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);

    labelProcessorLoad.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
    labelProcessorLoad.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);

    labelNIC.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
    labelNIC.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);

    buttonStart.setText("Start");
    buttonStart.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            buttonStartActionPerformed(evt);
        }
    });

    jLabel4.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
    jLabel4.setText("Szybkość łącza:");

    jLabel5.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
    jLabel5.setText("Obciążenie procesora:");

    jLabel6.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
    jLabel6.setText("Szybkość karty sieciowej:");

    javax.swing.GroupLayout infoPanelLayout = new javax.swing.GroupLayout(infoPanel);
    infoPanel.setLayout(infoPanelLayout);
    infoPanelLayout.setHorizontalGroup(
        infoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, infoPanelLayout.createSequentialGroup()
            .addComponent(labelLogo, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(infoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                .addGroup(infoPanelLayout.createSequentialGroup()
                    .addGroup(infoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jLabel5)
                        .addComponent(jLabel6)
                        .addComponent(jLabel4))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(infoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(labelLinkSpeed, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 146, Short.MAX_VALUE)
                        .addComponent(labelProcessorLoad, javax.swing.GroupLayout.DEFAULT_SIZE, 146, Short.MAX_VALUE)
                        .addComponent(labelNIC, javax.swing.GroupLayout.DEFAULT_SIZE, 146, Short.MAX_VALUE)))
                .addComponent(labelTitle, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 289, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGap(22, 22, 22))
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, infoPanelLayout.createSequentialGroup()
            .addContainerGap(352, Short.MAX_VALUE)
            .addComponent(buttonStart, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE))
    );
    infoPanelLayout.setVerticalGroup(
        infoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(infoPanelLayout.createSequentialGroup()
            .addContainerGap()
            .addGroup(infoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, infoPanelLayout.createSequentialGroup()
                    .addComponent(labelTitle)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(infoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                        .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(labelLinkSpeed, javax.swing.GroupLayout.DEFAULT_SIZE, 31, Short.MAX_VALUE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(infoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jLabel5)
                        .addComponent(labelProcessorLoad, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(infoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jLabel6)
                        .addComponent(labelNIC, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGap(6, 6, 6))
                .addGroup(infoPanelLayout.createSequentialGroup()
                    .addGap(16, 16, 16)
                    .addComponent(labelLogo, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)))
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 8, Short.MAX_VALUE)
            .addComponent(buttonStart)
            .addContainerGap())
    );

    javax.swing.GroupLayout formPanelLayout = new javax.swing.GroupLayout(formPanel);
    formPanel.setLayout(formPanelLayout);
    formPanelLayout.setHorizontalGroup(
        formPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 417, Short.MAX_VALUE)
    );
    formPanelLayout.setVerticalGroup(
        formPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 127, Short.MAX_VALUE)
    );

    jLabel8.setText("Uwagi:");

    buttonSend.setText("Wyślij");
    buttonSend.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            buttonSendActionPerformed(evt);
        }
    });

    labelForm.setFont(new java.awt.Font("Tahoma", 0, 14));
    labelForm.setText("Formularz:");

    infoLabel.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
    infoLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    infoLabel.setText("Kliknij przycisk \"Start\" aby rozpocząć test");

    commentText.setColumns(20);
    commentText.setRows(5);
    jScrollPane.setViewportView(commentText);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 437, Short.MAX_VALUE)
        .addGap(0, 437, Short.MAX_VALUE)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 417, Short.MAX_VALUE)
                .addComponent(formPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(infoLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 417, Short.MAX_VALUE)
                .addComponent(jLabel8, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(jProgressBar, javax.swing.GroupLayout.DEFAULT_SIZE, 417, Short.MAX_VALUE)
                .addComponent(infoPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(labelForm)
                .addComponent(buttonSend, javax.swing.GroupLayout.Alignment.TRAILING))
            .addContainerGap())
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 572, Short.MAX_VALUE)
        .addGap(0, 572, Short.MAX_VALUE)
        .addGroup(layout.createSequentialGroup()
            .addComponent(infoPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
            .addComponent(jProgressBar, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(infoLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
            .addComponent(labelForm)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(formPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(jLabel8, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(jScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 109, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addComponent(buttonSend)
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    );
}// </editor-fold>                        

public void createGUI()
{
    try {
        dataReader = new DataReader(this);
        dataReader.read();
        customerFields = dataReader.getCustomerFields();
        testTime = String.valueOf(dataReader.getTestTime());
        initComponents();
        generateCustomerForm();
        test = new Test(this, dataReader.getDownloadURLs(), dataReader.getTestTime());
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(AppletMain.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        Logger.getLogger(AppletMain.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        Logger.getLogger(AppletMain.class.getName()).log(Level.SEVERE, null, ex);
    } catch (UnsupportedLookAndFeelException ex) {
        Logger.getLogger(AppletMain.class.getName()).log(Level.SEVERE, null, ex);
    } catch (FileNotFoundException ex) {
        Logger.getLogger(AppletMain.class.getName()).log(Level.SEVERE, null, ex);
    }


}

private void buttonStartActionPerformed(java.awt.event.ActionEvent evt) {                                            
    buttonStart.setEnabled(false);
    infoLabel.setText("Poczekaj do końca testu...");
    progressBarTask = new ProgressBarTask(this);
            infoLabel.setText("progress bar");
    progressBarTask.addPropertyChangeListener(this);
    progressBarTask.execute();
    Thread testThread = new Thread(this.test);
    testThread.start();
    System.out.println("Test thread \"" + testThread.getName() + "\" started.");
}                                           

private void buttonSendActionPerformed(java.awt.event.ActionEvent evt) {                                           
    try {
        sendTestResults();
    } catch (MessagingException ex) {
        Logger.getLogger(AppletMain.class.getName()).log(Level.SEVERE, null, ex);
    } catch (UnsupportedEncodingException ex) {
        Logger.getLogger(AppletMain.class.getName()).log(Level.SEVERE, null, ex);
    }

}                                          

private void generateCustomerForm() throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException
{
    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
    //correcting auto-generated layout
    jLabel8.setFont(new java.awt.Font("Tahoma", 0, 11));
    labelProcessorLoad.setAlignmentX(RIGHT_ALIGNMENT);
    labelLogo.setIcon(new ImageIcon(getImage(getDocumentBase(), "orange.jpeg")));

    //gereate JLabels and JTextFields read from file
    GridBagLayout gridBagLayout = new GridBagLayout();
    GridBagConstraints gbc = new GridBagConstraints();
    formPanel.setLayout(gridBagLayout);
    customerData = new JTextField[customerFields.size()];

    for(int i=0; i<customerFields.size(); i++)
    {
        JLabel l = new JLabel(customerFields.get(i));
        l.setFont(new java.awt.Font("Tahoma", 0, 11));
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridx=0;
        gbc.gridy=i;
        gbc.weightx = 0.5;
        gbc.weighty = 0.5;
        formPanel.add(l, gbc);

        JTextField t = new JTextField();
        t.setFont(new java.awt.Font("Tahoma", 0, 11));
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridx=1;
        gbc.gridy=i;
        gbc.weightx = 0.5;
        gbc.weighty = 0.5;
        formPanel.add(t, gbc);
        customerData[i] = t;
    }

}

/**
 * Invoked when task's progress property changes.
 */
public void propertyChange(PropertyChangeEvent evt) {
    if (evt.getPropertyName().equals("progress")) {
        int progress = (Integer) evt.getNewValue();
        jProgressBar.setValue(progress);
    }
}

public void setLabelProcessorLoad(String text)
{
    labelProcessorLoad.setText(text);
}

public void setLabelLinkSpeed(String text)
{
    labelLinkSpeed.setText(text);
}

public void setLabelNIC(String text)
{
    labelNIC.setText(text);
}

public JProgressBar getProgressBar()
{
    return jProgressBar;
}

public JButton getButtonStart()
{
    return buttonStart;
}

public Test getTest()
{
    return this.test;
}

public void setNICspeed(String NICspeed) {
    this.NICspeed = NICspeed;
}

public void setCpuLoad(String cpuLoad) {
    this.cpuLoad = cpuLoad;
}

public void setSpeed(String speed) {
    this.speed = speed;
}

public JLabel getInfoLabel() {
    return infoLabel;
}
/**
 * Prepares e-mail message for sending via google SMTP protocol with SSL
 */
private void sendTestResults() throws MessagingException, UnsupportedEncodingException{
    Properties props = new Properties();
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.socketFactory.port", "465");
    props.put("mail.smtp.socketFactory.class",
            "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.port", "465");

    Session session = Session.getDefaultInstance(props,
    new javax.mail.Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username,password);
        }
    });

    MimeMessage message = new MimeMessage(session);
    //Setting message fields
    Address toAddress = new InternetAddress(dataReader.getMail(), "SpeedTest crew");
    message.addRecipient(Message.RecipientType.TO, toAddress);
    message.setSubject("SpeedTest");

    message.setText(prepareMailText(), "UTF8");

    Transport.send(message);
    infoLabel.setText("Wiadomość z wynikami testu została wysłana pomyślnie");
    System.out.println("Mail sent.");
}

/**
 * Gets all test results and customer data and prepares mail content
 * @return the content of e-mail body
 */
private String prepareMailText()
{
    String messageContentHeader = "Prędkość pobierania\t" + "Obciążenie procesora\t" +
            "Szybkość łącza karty sieciowej\t" + "Czas trwania testu\t";
    String messageContent = speed + "\t"+ cpuLoad + "\t" + NICspeed + "\t" + testTime + "\t";

    for(int j=0;j<customerData.length;j++)
    {
        messageContentHeader += customerFields.get(j) + "\t";
        messageContent += customerData[j].getText() + "\t";
    }
    messageContentHeader += "Uwagi";
    messageContent += commentText.getText();
    String messageText = messageContentHeader + "\n" + messageContent;
    return messageText;
}

// Variables declaration - do not modify                     
private javax.swing.JButton buttonSend;
private javax.swing.JButton buttonStart;
private javax.swing.JTextArea commentText;
private javax.swing.JPanel formPanel;
private javax.swing.JLabel infoLabel;
private javax.swing.JPanel infoPanel;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel8;
private javax.swing.JProgressBar jProgressBar;
private javax.swing.JScrollPane jScrollPane;
private javax.swing.JLabel labelForm;
private javax.swing.JLabel labelLinkSpeed;
private javax.swing.JLabel labelLogo;
private javax.swing.JLabel labelNIC;
private javax.swing.JLabel labelProcessorLoad;
private javax.swing.JLabel labelTitle;
// End of variables declaration                   



}

I also had a problem with other libraries like Sigar.jar, but I suppose it will solve similarly. 我也遇到了像Sigar.jar这样的其他库的问题,但我想它会解决类似问题。

Somebody has good tips? 有人有好的建议吗?

It is necessary to add the Jar containing the javax.mail packages to the run-time class-path of the applet. 有必要将包含javax.mail包的Jar添加到applet的运行时类路径中。 To achieve that (one way is to) put that Jar in the same place SpeedTester.jar and change the archive attribute from: 为了实现这一点(一种方法)将Jar放在SpeedTester.jar的相同位置并从以下位置更改存档属性:

archive="SpeedTester.jar"

..to: ..至:

archive="SpeedTester.jar,mail.jar"

Update 1 更新1

Change the entire applet element: 更改整个applet元素:

From

<APPLET 
    code="speedtester_pkg/AppletMain.class" 
    archive="SpeedTester.jar" 
    width=440     
    height=600>
</APPLET>

To

<APPLET 
    code="speedtester_pkg.AppletMain" 
    archive="SpeedTester.jar,mail.jar" 
    width=440     
    height=600>
</APPLET>

Presuming the package of the applet class is speedtester_pkg and the applet is named AppletMain . 假设applet类的包是speedtester_pkg ,applet名为AppletMain The code attribute should be the fully qualified name of the applet class, not the path/file name. code属性应该是applet类的完全限定名,而不是路径/文件名。

Update 2 更新2

The above advice re. 以上建议重新。 the mail.jar does not account for classes that are referenced from within the Test , DataReader or ProgressBarTask (or the classes they load). mail.jar不考虑从TestDataReaderProgressBarTask (或它们加载的类)中引用的类。 'Rinse and repeat' that advice for adding extra APIs to the run-time class-path using the archive attribute. 使用archive属性“冲洗并重复”有关向运行时类路径添加额外API的建议。

Note 注意

It seems the other answers are referring to a web-app. 似乎其他答案指的是一个网络应用程序。 that is entirely server-side. 这完全是服务器端的。 For such a web-app., putting Jars into the lib makes sense. 对于这样的web-app。,将Jars放入lib是有道理的。 OTOH an applet can only access a Jar that is available by copy/pasting the URL of the Jar into the browser address bar and hitting enter . OTOH小程序只能通过将Jar的URL复制/粘贴到浏览器地址栏并按Enter键来访问可用的Jar。

In fact doing just that, using a combination of the code-base & href of the Jar, is a good 'acid test' of whether an applet will be able to access the archive. 事实上,使用Jar的代码库和href的组合,对于applet是否能够访问存档是一个很好的“酸测试”。

Looks like you're missing the JAR with javax.mail.Authenticator 看起来你错过了javax.mail.Authenticator的JAR

You can use the FindJar site to figure out what the name of the JAR is and where to download it. 您可以使用FindJar站点来确定JAR的名称以及下载位置。 Google for it; 谷歌为它; it's worth knowing about. 值得了解的。

You might be missing others as well. 你可能也会错过其他人。 Keep adding JARs to your app's WEB-INF/lib until those CNF exceptions go away. 继续将JAR添加到应用程序的WEB-INF / lib中,直到CNF异常消失为止。

Missing JARs (mail.jar in your case) is the primary reason for any ClassNotFound exception. 缺少JAR(在您的情况下为mail.jar)是任何ClassNotFound异常的主要原因。 Place it in your app server's lib directory to resolve this. 将它放在app服务器的lib目录中以解决此问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM