MySQL и JApplet (да, еще один)

#java #mysql #applet

#java #mysql #апплет

Вопрос:

Прежде чем я начну, я хотел бы упомянуть, что я тщательно исследовал это и еще не нашел решение, которое сработало для меня (хорошие 2-3 дня исследований).

В настоящее время используется: WampServer версии 2.1 (служба Apache отключена)
Eclipse-jee x64
javac 1.6.0_22
Windows 7 x64

Апплет, веб-страница и база данных находятся на моем локальном компьютере.

Прежде всего, мой апплет работает без проблем в Eclipse IDE, однако я постоянно получаю следующую ошибку при попытке запустить его как applet.html с помощью следующего скрипта:

 <applet code="GUI.class"
    name="Some name goes here"
    archive="APTracker.jar"
    width="1000" height="700">
    Your browser is not Java enabled.
</applet>
  
  1. Я экспортировал файлы своих классов с помощью Eclipse IDE, которая включила манифест в appletJar.jar .
  2. Jar, экспортированный Eclipse, не содержит библиотеки mysql-connector
  3. После сборки моих файлов классов я вручную извлек файлы com и org из mysql-connector jar и ввел их в свой appletJar.jar
  4. После этого я подписал свой applet jar (и подтвердил, что он подписан) ключом, срок действия которого истекает через 6 месяцев.

После этих шагов я все еще получаю сообщение об ошибке, показанное ниже.

Я попытался заменить localhost на 127.0.0.1, который не сработал. Я также попытался разместить mysql-connector.jar в файлах jre, jdk и корневого класса, которые не показали изменений.

     private final String DRIVER = "com.mysql.jdbc.Driver";
    private final String DATABASE_URL = "jdbc:mysql://localhost:3306/javadb";
    private final String USERNAME = "xxxxxx";
    private final String PASSWORD = "xxxxxx";

    private Connection connection = null;
    private PreparedStatement selectAllAirports = null;

    private ResultSet resultSet;
    private ResultSetMetaData metaData;

    /* Establish PreparedStatements */
    public ResultSetTableModel()
    {
        try
        {   
            //establish connection to database
            connection = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD);

            //load driver class
            Class.forName( DRIVER );

            //create prepared statements
            selectAllAirports = connection.prepareStatement( "SELECT asciiname, latitude, longitude, elevation, timezone, country_code FROM geoname;" );
        }
        catch ( SQLException sqlException )
        {
            sqlException.printStackTrace();
            //System.exit(1);
        }
        catch ( ClassNotFoundException classNotFound )
        {
            System.out.println("ClassNotFoundException triggered.");
            classNotFound.printStackTrace();
        }
    }
  

Это сообщение об ошибке, которое я получаю:

C:UsersMr.DesktopApplet > appletviewer applet.html 
java.sql.SQLException: не найден подходящий драйвер для jdbc:mysql://localhost: 3306/javadb 
 в java.sql.DriverManager.getConnection(DriverManager.java:602)
 в java.sql.DriverManager.getConnection(DriverManager.java:185)
 в ResultSetTableModel.(ResultSetTableModel.java:38) 
 в GUI.(GUI.java:20) 
 в sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод)

 в sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
 в sun.reflect.Делегирование constructoraccessorimpl.newInstance (делегирование constructoraccessorimpl.java:27) 
 в java.lang.reflect.Конструктор.Новый экземпляр (Constructor.java:513)
 на java.lang.Class.newInstance0(Class.java:355)
 на java.lang.Class.newInstance(Class.java:308)
 в sun.applet.AppletPanel.createApplet(AppletPanel.java:785)
 в sun.applet.AppletPanel.runLoader (AppletPanel.java:714)
 в sun.applet.AppletPanel.run(AppletPanel.java:368)
 на java.lang.Thread.run(поток.java:662)
java.lang.Исключение ArrayIndexOutOfBoundsException: 0 >= 0
 в java.util.Vector.ElementAt(Vector.java:427) 
 в javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:277) 
 в GUI.init(GUI.java:60) 
 в sun.applet.AppletPanel.run(AppletPanel.java:424) 
 на java.lang.Thread.run(поток.java:662)

Комментарии:

1. 1 за то, что вы сначала выполнили поиск и написали хорошее объяснение вашей проблемы.

2. Вы можете попробовать: archive=»APTracker.jar ,mysqlDriver.jar »

Ответ №1:

Обратите внимание, что для последних версий драйверов JDBC не требуется Class.forName() вызов,если поддерживается метод service loader.

Текущая версия Connector / J действительно поддерживает это, но, включая только каталоги org и com драйвера JDBC, вы «сломали» его: механизм загрузки службы зависит от файлов в META-INF каталоге.

Итак, с вашей настройкой вам действительно понадобится Class.forName() вызов. Но в вашем коде этот код находится после попытки установить соединение, что не принесет никакой пользы.

Итак, сделайте один из этих:

  • Добавьте соответствующие служебные файлы из драйвера JDBC (в META-INF/services разделе) в свой jar-файл (и избавьтесь от ненужного Class.forName() вызова) или
  • Поместите Class.forName() вызов перед DriverManager.getConnection() вызовом.

Комментарии:

1. Превосходное объяснение, и после выполнения второго шага я смог сжать весь апплет в один JAR-файл и HTML-файл. Большое вам спасибо!

Ответ №2:

Вместо того, чтобы пытаться вручную поместить файлы классов MySQL в ваш APTracker.jar, почему бы просто не включить MySQL jar в classpath апплета?

Я подозреваю, что в каталоге META-INF файла MySQL jar есть что-то, что вам нужно — файл конфигурации ServiceLoader или что-то подобное.

Комментарии:

1. Вероятно, потому, что его файл jar подписан, и вы не можете смешивать подписанные и неподписанные классы в апплете.

2. Да, но он всегда мог подписать файл MySQL jar.

3. Я не уверен, почему я не попробовал это раньше. Подписал файл jar драйвера, включил его и теперь работает как шарм, большое вам спасибо!!

Ответ №3:

Следует учитывать следующие моменты:

  1. Есть ли у вас mysql-connector-java-5.1.10.jar или какой-либо связанный соединитель на вашем компьютере? Если нет, спросите это в Google?
  2. Если у вас есть, вставьте соединитель в C:Program FilesJavajdk...jrelibext каталог.
  3. Отредактируйте тег апплета в архиве как archive = APTracker.jar, mysql-connector-java-5.1.10.jar
  4. Вставьте снова mysql-connector-java-5.1.10.jar туда, где расположены файлы, такие как .html, .class и тому подобное.

Комментарии:

1. Не помещайте Jars в jrelibext каталог (пункт 2)! Добавьте их в путь к классу приложений во время выполнения. по мере необходимости.

Ответ №4:

Я предполагаю, что jar-файл MySQL JDBC отсутствует.

вы можете загрузить этот jar с:http://www.mysql.com/downloads/connector/j

Комментарии:

1. Я уже включил соединитель в свои jre, jdk и class filepath — все из которых не показали никаких изменений.

2. Также я совершенно уверен, что получил бы исключение ClassNotFoundException, если бы отсутствовал JDBC jar, а не SQLException.

3. «Я предполагаю, что JAR-файл MySQL JDBC отсутствует». Похоже на то, если только не вызывается MySQL Jar APTracker.jar (в чем я сомневаюсь). Только классы в Jars, упомянутые в archive атрибуте, доступны для пути к классу во время выполнения апплета (игнорируя их существование в каталоге расширений JRE — что на самом деле не работает для апплета).

4. @Andrew: требуемые com и org файлы были извлечены из JDBC jar и введены в APTracker.jar .