Добавьте OJBD C в Classpath при выполнении .jar - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь разработать приложение Java, которое подключается к базе данных Oracle и выполняет функцию. Если я запускаю приложение в Eclipse, оно работает, но когда я пытаюсь запустить .jar в Windows Командная строка, я получаю «Ошибка обнаружена: java. sql .SQLException: Подходящий драйвер не найден».

Я передаю путь ко всем файлам .jar, которые отображаются в Maven Dependencies в Eclipse при выполнении в командной строке.

Шаги

  1. Выполнить "mvn clean install -U"

  2. Выполнить .jar из целевого каталога с помощью "java -cp example-1.0-SNAPSHOT.jar; C: / Users / меня / .m2 / хранилище / JUnit / JUnit / 4,11 / JUnit-4,11-sources.jar C: / Users / мне / .m2 / хранилище / орг / Hamcrest / Hamcrest-жильный / 1,3 / Hamcrest-ядро-1.3- sources.jar; C: / Users / мне / .m2 / хранилище / ком / оракул / ojdbc / ojdbc10 / 19.3.0.0 / ojdbc10-19.3.0.0-sources.jar; C: / Users / я /. м2 / хранилище / ком / оракул / ojdbc / UCP / 19.3.0.0 / UCP-19.3.0.0-sources.jar; C: / Users / мне / .m2 / хранилище / ком / оракул / ojdbc / oraclepki / 19,3. 0,0 / oraclepki-19.3.0.0-sources.jar; C: / Users / мне / .m2 / хранилище / ком / оракул / ojdbc / osdt_cert /19.3.0.0/osdt_cert-19.3.0.0-sources.jar;C:/Users/me/.m2/repository/com/oracle/ojdbc/osdt_core/19.3.0.0/osdt_core-19.3.0.0-sources.jar ; C: / Users / мне / .m2 / хранилище / ком / оракул / ojdbc / simplefan / 19.3.0.0 / simplefan-19.3.0.0-sources.jar; C: / Users / мне / .m2 / хранилище /com/oracle/ojdbc/ons/19.3.0.0/ons-19.3.0.0-sources.jar function.example.App "

  3. ИЛИ (как предложено ниже) выполнить .jar из целевого каталога с "java -cp example-1.0-SNAPSHOT.jar; C: / Users / me / .m2 / repository / junit / junit / 4.11 / junit-4.11.jar; C: / Users / me /. м2 / хранилище / орг / Hamcrest / Hamcrest-жильный / 1,3 / Hamcrest-ядро-1.3.jar; C: / Users / мне / .m2 / хранилище / ком / оракул / ojdbc / ojdbc10 / 19.3.0.0 / ojdbc10- 19.3.0.0.jar; C: / Users / мне / .m2 / хранилище / ком / оракул / ojdbc / UCP / 19.3.0.0 / UCP-19.3.0.0.jar; C: / Users / я /. м2 / хранилище / ком / оракул / ojdbc / oraclepki / 19.3.0.0 / oraclepki-19.3.0.0.jar; C: / Users / мне / .m2 / хранилище / ком / оракул / ojdbc / osdt_cert / 19.3.0.0 / osdt_cert-19.3.0.0.jar; C: / Users / мне / .m2 / хранилище / ком / оракул / ojdbc / osdt_core / 19.3.0.0 / osdt_core-19.3.0.0.jar; C: / Users / мне / .m2 / хранилище / ком / оракул / ojdbc / simplefan / 19.3.0.0 / simplefan-19.3.0.0. jar; C: / Users / me / .m2 / хранилище / com / oracle / ojdbc / ons / 19.3.0.0 / ons-19.3.0.0.jar function.example.App "

Приложение

package function.example;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class App {
    public static void main(String[] args) {
        String result = null;
        try {
            result = checkForPalindrome("racecar");
        } catch (SQLException e) {
            System.out.println("Error encountered: " + e);
            e.printStackTrace();
        }
        System.out.println(result);
    }

    public static Connection getConnection() {

        Properties prop = ReadPropertyFile();
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(prop.getProperty("db.URL"), prop.getProperty("db.user"),
                    prop.getProperty("db.password"));
        } catch (SQLException e) {
            System.out.println("Error encountered: " + e);
            e.printStackTrace();
        }
        return conn;
    }

    public static String checkForPalindrome(String word) throws SQLException {
        String sql = "{? = call CHECKFORPALINDROME(?)}";
        try (Connection conn = getConnection(); java.sql.CallableStatement stmt = conn.prepareCall(sql);) {
            stmt.setString(2, word);
            stmt.registerOutParameter(1, java.sql.Types.VARCHAR);
            stmt.execute();
            String stmtResult = stmt.getString(1);
            return stmtResult;
        }
    }

    private static Properties ReadPropertyFile() {
        Properties prop = new Properties();
        try (InputStream input = new FileInputStream("c:\\config.properties")) {
            prop.load(input);
        } catch (FileNotFoundException e) {
            System.out.println("Error encountered: " + e);
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("Error encountered: " + e);
            e.printStackTrace();
        }
        return prop;
    }
}

POM

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>function</groupId>
    <artifactId>example</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>ODB-function-example-pom</name>
    <url>http://maven.apache.org</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.oracle.ojdbc/ojdbc10 -->
        <dependency>
            <groupId>com.oracle.ojdbc</groupId>
            <artifactId>ojdbc10</artifactId>
            <version>19.3.0.0</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>8</release> 
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>function.example.App</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Исправление

Удалена зависимость ojdbc10 из мой пом Скачал ojdbc8 с веб-сайта Oracle (я не могу загрузить его с помощью mvnrepository), добавил эти файлы .jar вручную в Eclipse и в classpath при выполнении в командной строке.

java - cp example-1.0-SNAPSHOT.jar; C: \ Users \ me \ Desktop \ ojdbc8-full * function.example.App

1 Ответ

0 голосов
/ 29 марта 2020

Кажется, что у вас есть jar без зависимостей, поэтому ваши классы оракулов ojdbc не включены в окончательный jar. То, что вы хотите иметь, это "толстый кувшин" .

Способ сделать это - добавить плагин maven, который будет упаковывать все зависимости в приложении jar. Этого можно достичь с помощью maven-assembly-plugin:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.4.1</version>
    <configuration>
        <!-- get all project dependencies -->
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <!-- MainClass in mainfest make a executable jar -->
        <archive>
            <manifest>
                <mainClass>function.example.App</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase> 
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Таким образом, если вы запустите mvn package, у вас будет jar-with-dependencies артефакт, который будет содержать все зависимости.

Обновление

Ваше приложение не может обнаружить класс драйвера во время выполнения, поэтому вам также необходимо загрузить его вручную. Обычно это выглядит примерно так:

Class<?> clazz = Class.forName("oracle.jdbc.driver.OracleDriver");
Driver driver = (Driver) clazz.newInstance();
DriverManager.registerDriver(driver);
...