无法在我的 jar 中加载本地 jar

Unable to load local jar inside my jar

我正在为此苦思冥想,但找不到任何解决方案。 我正在使用 jboss-fuse-6.1.0.redhat-379 服务器并在 Jboss_home/deploy/ 文件夹

中部署我的 jar

我遇到的问题是,当我 运行 我的应用程序时,我无法加载 oracle ojdbc jar。我尝试在我的本地存储库中添加这个 ojdbc14.jar,然后在 POM 中添加依赖项,如:

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc14</artifactId>
    <version>10.2.0.4.0</version>
</dependency>

它成功解决了导入问题,但是当我在 Jboss 和 运行 我的应用程序中部署我的 jar 时,它给出了一个错误:

java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@//ip:port/some_name

我也试过在 POM 中添加这样的 ojdbc.jar:

<dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc14</artifactId>
    <version>10.2.0.4.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/libs/ojdbc14-10.2.0.4.0.jar</systemPath>
</dependency>

但仍然收到相同的 "No suitable driver found" 消息。 任何帮助我如何在我的罐子里添加 ojdbc.jar?

**** 更新 ****

Java代码:

try
   {
   //   File CP_file = new File("/home/path/to/ojdbc14.jar");
   //   DBFactory dbMethod = new DBFactory();
   //   dbMethod.addJarToClasspath(CP_file);

      Class.forName ("oracle.jdbc.OracleDriver");
      String dbURL = "jdbc:oracle:thin:@//ip:port/name";
      String userID = "userid";
      String password = "pass";

  //  dbMethod.isJarOnClassPath(CP_file);

      Connection dbConnection=DriverManager.getConnection(dbURL,userID,password);
// getting exception on above line

当您在 pom.xml 中使用 system 范围的依赖项时,依赖项的 jar 文件不会打包到您的二进制文件中。换句话说,jar 不在类路径中。

  1. 尝试使用 Maven 的 provided-scope。然后 odbc-jar 必须在 JBoss 的某个 lib 文件夹中,类似于 Tomcat 中的 lib-folder。

  2. 您可以将 install odbc-jar 放入您的本地 Maven 存储库,然后包含 default-scope.

    [=30= 的依赖项]
  3. 如果您的情况是,jar 不可部署,因为它 must 被放置在文件系统中的特定路径上,我会尝试添加 jar-File 在 运行 时间内添加到类路径。在与您不同的上下文中,我能够使用以下代码段部署和 运行 我的库。

在您找到更好的东西之前,希望它能作为 work-around:

private boolean addJarToClasspath( File jarFile )
{
    try
    {
        URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
        Class<?> urlClass = URLClassLoader.class;
        Method method = urlClass.getDeclaredMethod( "addURL", new Class<?>[] { URL.class } );
        method.setAccessible( true );
        method.invoke( urlClassLoader, new Object[] { jarFile.toURI().toURL() } );
        System.out.println( jarFile.getAbsolutePath() + " dynamically added to classpath" );
        return true;
    }
    catch (Exception e)
    {
        e.printStackTrace();
        return false;
    }
}

private boolean isJarOnClassPath( File jarFile )
{
    URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
    URL[] urls = urlClassLoader.getURLs();
    for ( URL url : urls )
    {
        File file = new File( url.getFile() );
        if ( file.getPath().endsWith( jarFile.getName() ) )
        {
            System.out.println( jarFile.getAbsolutePath() + " is on classpath" );
            return true;
        }
    }
    return false;
}

我也有同样的问题,我解决了

将此存储库放入您的 pom 文件

   <repository>
       <id>codelds</id>
       <url>https://code.lds.org/nexus/content/groups/main-repo</url>
    </repository>

然后添加你的依赖

 <!-- ORACLE JDBC driver, need install yourself -->
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.1.0</version>
    </dependency>

您可以使用 Maven Bundle Plugin 在您的包中嵌入一个 JAR。 这还将负责在您的清单中添加正确的 OSGi headers。

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <extensions>true</extensions>
    <configuration>
        <instructions>
            <Embed-Dependency>ojdbc6</Embed-Dependency>
        </instructions>
    </configuration>
</plugin>

总之这不是一个好的方法。我建议使用 JPA 或将 Oracle JDBC 驱动程序添加到 lib/ 文件夹并通过系统包导出它们。

你可以使用 wrap 协议在 karaf 中安装

osgi:install -s wrap:mvn:groupid/artifactid/version