Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java URLClassLoader不读取插件的外部JAR库_Java_Plugins_Jar_Classloader_Urlclassloader - Fatal编程技术网

Java URLClassLoader不读取插件的外部JAR库

Java URLClassLoader不读取插件的外部JAR库,java,plugins,jar,classloader,urlclassloader,Java,Plugins,Jar,Classloader,Urlclassloader,我用Java实现了一个简单的基于插件的应用程序。主插件类派生自名为“plugin”的抽象类。应用程序从JAR文件读取该类,并通过创建该类的实例来运行插件。我猜是标准程序:) 直到现在一切都很好。但当我在插件中包含一个库时,问题就出现了,比如MySQL连接器。执行后会引发异常NoClassDefFoundError和ClassNotFoundException。我通过向主应用程序添加MySQL连接器库来克服这个问题,但这有什么意义呢?:) 我不是Java专家,所以我不确定是否有其他解决方案,比如为

我用Java实现了一个简单的基于插件的应用程序。主插件类派生自名为“plugin”的抽象类。应用程序从JAR文件读取该类,并通过创建该类的实例来运行插件。我猜是标准程序:)

直到现在一切都很好。但当我在插件中包含一个库时,问题就出现了,比如MySQL连接器。执行后会引发异常NoClassDefFoundError和ClassNotFoundException。我通过向主应用程序添加MySQL连接器库来克服这个问题,但这有什么意义呢?:)

我不是Java专家,所以我不确定是否有其他解决方案,比如为库定义类路径等

这是我的插件加载程序:

这是我的插件基类:

我正在从GUI执行:

    private void jButtonAddActionPerformed(java.awt.event.ActionEvent evt) {
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileFilter(new FileNameExtensionFilter("JTask Plugin (*.JAR)", "JAR"));

        if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)
        {
            File pluginFile = fileChooser.getSelectedFile();
            PluginLoader pluginLoader = new PluginLoader();
            Plugin plugin = pluginLoader.loadPlugin(pluginFile);
            if (plugin != null)
                jPanelPlugins.add(new PluginControl(jPanelPlugins, plugin));
        }
    }

您还应该包括您的源代码


您是如何通过命令行或GUI执行该类的?如果是从命令行,那么MySQLConnector库以及任何其他依赖库必须包含在类路径(java-classpath)中。这个问题的顶部答案应该对您有所帮助-

如果您的类是Mysql驱动程序,您必须排除(在类调用时)不可用的类。在您的.jar文件的文件夹中,有一个名为“integration”的文件,其中包含“jboss”和“c3p0”,目前还不存在

while (en.hasMoreElements()) { 
                JarEntry entry = new JarEntry(en.nextElement());
                String name = entry.getName();
                if (name.contains("/integration/")) {
                  continue;
                } else {
                 if (!entry.isDirectory() && name.toLowerCase().endsWith(".class"))
                 {
                    classList.add(name.replace(".class", ""));
                 }
                }
}
这将加载一个mysql.xxx.jar文件。 试试这个


dynamicload.java



好吗?

谢谢。我在jar文件中找到了一些关于更新清单的内容,但看起来还是太详细了。我正在寻找不需要在外部更改主应用程序的东西。不幸的是,JAR结构中没有这样的“集成”文件夹。我在“mysql-connector-java-5.0.4-bin.JAR”和“mysql-connector-java-5.1.6-bin.JAR”中找到了id。请告诉我你的.jar文件的名称。它在刚刚下载的文件中,我正在使用“mysql-connector-java-5.1.19-bin.jar”,我在上面添加了代码。更改设置并运行。有一个“com/mysql/jdbc/integration/”文件夹。你可以相信我;)
package dynamicloading;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.DriverPropertyInfo;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.Properties;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

/**
 *
 * @author Administrator
 */
class com_mysql_jdbc_Driver implements Driver {
    private Driver driver;
    com_mysql_jdbc_Driver(Driver cmjd) {
        this.driver = cmjd;
    }
    @Override
    public boolean acceptsURL(String aurlS) throws SQLException {
        return this.driver.acceptsURL(aurlS);
    }
    @Override
    public Connection connect(String aurlS, Properties pP) throws SQLException {
        return this.driver.connect(aurlS, pP);
    }
    @Override
    public int getMajorVersion() {
        return this.driver.getMajorVersion();
    }
    @Override
    public int getMinorVersion() {
        return this.driver.getMinorVersion();
    }
    @Override
    public DriverPropertyInfo[] getPropertyInfo(String aurlS, Properties pP) throws SQLException {
        return this.driver.getPropertyInfo(aurlS, pP);
    }
    @Override
    public boolean jdbcCompliant() {
        return this.driver.jdbcCompliant();
    }
}

public class DynMain {

    /**
     * @param args the command line arguments
     */

    public static void main(String[] args) throws Exception {
        /* please set to your path*/
        File file = new File("U:/mozsamples/mysql-connector-java-5.1.19-bin.jar");
        Driver cmjdD;
        String aktCS;
        String urlS = "jdbc:mysql://localhost/db";
        String userS = "must-be-set";
        String passS = "must-be-set";
        Connection con;
        Statement stmt;
        URLClassLoader clazzLoader = URLClassLoader.newInstance(new URL[]{file.toURI().toURL()});
        JarFile jarFile = new JarFile(file);
        Enumeration<JarEntry> entries = jarFile.entries();

        while (entries.hasMoreElements()) {
            JarEntry element = entries.nextElement();
            if (element.getName().endsWith(".class")) {
                String name = element.getName();
                if (name.contains("/integration/")) {
                  System.out.println( "ignored: " + name );
                  continue;
                } else
                {
                try {    
                    aktCS = element.getName().replaceAll(".class", "").replaceAll("/", ".");
                    clazzLoader.loadClass(aktCS);
                    if (name.contains("com/mysql/jdbc/Driver")) {
                        cmjdD = (Driver)Class.forName(aktCS, true, clazzLoader).newInstance();
                        try {
                        DriverManager.registerDriver(new com_mysql_jdbc_Driver(cmjdD));
                        System.out.println( "register Class: " + aktCS );
                        } catch (SQLException e) {
                          e.printStackTrace();
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                }
            }
        } 
    try {
    con = DriverManager.getConnection(urlS,userS,passS);
    stmt = con.createStatement();
    /*ResultSet rs = stmt.executeQuery("select * from idcart where ID=255"); */

    stmt.close();
    } catch (SQLException esql) {
        esql.printStackTrace();
    }
   int j=0 ;
   System.out.println("loaded Driver----------------------------------");
   for( Enumeration en = DriverManager.getDrivers() ; en.hasMoreElements() ; j++)
         System.out.println( en.nextElement().getClass().getName() );

   if (j==0) { System.out.println("Driverlist empty"); }

    System.out.println("-----------------------------------------------");
    }
}
register Class: com.mysql.jdbc.Driver
ignored: com/mysql/jdbc/integration/c3p0/MysqlConnectionTester.class
ignored: com/mysql/jdbc/integration/jboss/ExtendedMysqlExceptionSorter.class
ignored: com/mysql/jdbc/integration/jboss/MysqlValidConnectionChecker.class
loaded Driver----------------------------------
sun.jdbc.odbc.JdbcOdbcDriver
dynamicloading.com_mysql_jdbc_Driver
-----------------------------------------------