#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>
- Я экспортировал файлы своих классов с помощью Eclipse IDE, которая включила манифест в appletJar.jar .
- Jar, экспортированный Eclipse, не содержит библиотеки mysql-connector
- После сборки моих файлов классов я вручную извлек файлы
com
иorg
из mysql-connector jar и ввел их в свой appletJar.jar - После этого я подписал свой 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:
Следует учитывать следующие моменты:
- Есть ли у вас
mysql-connector-java-5.1.10.jar
или какой-либо связанный соединитель на вашем компьютере? Если нет, спросите это в Google? - Если у вас есть, вставьте соединитель в
C:Program FilesJavajdk...jrelibext
каталог. - Отредактируйте тег апплета в архиве как
archive = APTracker.jar, mysql-connector-java-5.1.10.jar
- Вставьте снова
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 .