Зависимости файла JAR в Java 1.4 - PullRequest
2 голосов
/ 26 августа 2009

Я работаю над небольшим Java-проектом, который теперь подключается к базе данных MS SQL Server 2000, но вскоре подключится к базе данных MS SQL Server 2005. Я создаю одну банку для удобства развертывания. Я пытался настроить его так, чтобы я мог просто изменить файл конфигурации и изменить драйверы (как я сделал бы в .NET). Однако из-за ограничений встроенного в Java Jar classpath и отсутствия подстановочного знака во встроенном classpath (1). Есть ли способ обойти эту проблему, не ссылаясь явно на каждый драйвер jar? Если мне придется сделать это, мне придется перекомпилировать каждый раз, когда база данных меняется ...

(1) : Однако подстановочные знаки пути к классу не учитываются в заголовке jar-манифеста Class-Path.

Ответы [ 4 ]

2 голосов
/ 26 августа 2009

Как правило, вы можете изменить classpath во время выполнения . Подобные подходы являются основным способом работы с jar-файлами типа «плагин» в Java (очень похожие требования для вашего случая).

0 голосов
/ 26 августа 2009

Я бы сказал, что это не способ Java (как в стандартной практике) включать сторонний код в тот же Jar, который вы развертываете. Однако jar - это просто zip-файл, поэтому в большинстве случаев (за исключением некоторых необычных вещей, происходящих в манифестах) вы можете комбинировать их, если вам нужно.

При этом вы можете включить в свой файл jar ссылку на путь к классу для всех потенциальных jar-драйверов JDBC или просто правильно вызвать jar-драйвер JDBC. Затем поместите файл конфигурации в тот же каталог (обязательно включите его в путь к классу JAR), а затем прочитайте имя драйвера из него и используйте Class.forName () для загрузки драйвера.

Вы можете делать более причудливые вещи (например, найти правильный jar во время выполнения и динамически загрузить его, даже если его нет в пути к классам), но эти вещи немного сложнее, поэтому должно работать что-то простое, подобное приведенному выше.

Вам никогда не придется перекомпилировать. Вы действительно не правильно делаете JDBC, если вам приходится перекомпилировать при смене драйверов.

0 голосов
/ 26 августа 2009

Вы должны разделить файл jar драйвера и фактическое имя драйвера JDBC для конкретного поставщика.

Я бы очень рекомендовал не включать jar-драйверы jdbc в ваш собственный jar. Просто у них к пути во время выполнения. Точно так же вы можете получить имя диспетчера драйверов JDBC из системных свойств во время выполнения или даже из файла конфигурации.

Так работает приложение, как это:

java -jar myapp.jar -cp sqlserver.jar -DdriverManager=com.microsoft.sqlserver.jdbc.SQLServerDriver -DdbUrl=jdbc:some:url

и в вашем приложении сделайте что-то вроде этого (я опускаю обработку исключений):

Class.forName(System.getProperty("driverManager"));
Connection conn = DriverManager.getConnection(System.getProperty("dbUrl"))

;

Таким образом, вы можете изменить драйверы, просто добавив соответствующий файл jar в classpath и изменив свойства driverManager и dbUrl. Таким образом, вам не нужно перекомпилировать для поддержки новых драйверов.

Это самое простое решение, которое я могу придумать.

0 голосов
/ 26 августа 2009

Вы можете включить информацию о том, какой драйвер использовать, например. файл конфигурации. Или в манифесте самого файла JAR. Просто включите все файлы JAR при запуске приложения, но загрузите имя драйвера из конфигурации.

...