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

Java 无法在我的jar中加载本地jar,java,maven,jboss6.x,jbossfuse,ojdbc,Java,Maven,Jboss6.x,Jbossfuse,Ojdbc,我正在为此绞尽脑汁,但找不到任何解决办法。 我正在使用jboss-fuse-6.1.0.redhat-379服务器,并在jboss_home/deploy/folder中部署我的jar 我遇到的问题是,在运行应用程序时,无法加载oracle ojdbc jar。我已尝试在本地存储库中添加此ojdbc14.jar,然后在POM中添加依赖项,如: <dependency> <groupId>com.oracle</groupId> <arti

我正在为此绞尽脑汁,但找不到任何解决办法。 我正在使用jboss-fuse-6.1.0.redhat-379服务器,并在jboss_home/deploy/folder中部署我的jar

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

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

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

  • 尝试使用Maven提供的
    范围。然后odbc jar必须位于JBoss的某个lib文件夹中,类似于Tomcat中的lib文件夹

  • 您可以
    odbc jar安装到本地Maven存储库中,然后使用默认范围包含依赖项

  • 如果您的场景是,jar是不可部署的,因为它
    必须
    放置在文件系统中的特定路径上,我会尝试在运行时将jar文件添加到类路径中。在与您不同的另一个上下文中,我能够使用以下代码片段部署和运行我的库

  • 在你找到更好的东西之前,希望它能作为一种解决方法:

    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;
    }
    
    private boolean addJarToClasspath(文件jarFile)
    {
    尝试
    {
    URLClassLoader URLClassLoader=(URLClassLoader)ClassLoader.getSystemClassLoader();
    类urlClass=URLClassLoader.Class;
    方法Method=urlClass.getDeclaredMethod(“addURL”,新类[]{URL.Class});
    方法setAccessible(true);
    invoke(urlClassLoader,新对象[]{jarFile.toURI().toURL()});
    System.out.println(jarFile.getAbsolutePath()+“动态添加到类路径”);
    返回true;
    }
    捕获(例外e)
    {
    e、 printStackTrace();
    返回false;
    }
    }
    私有布尔值isJarOnClassPath(文件jarFile)
    {
    URLClassLoader URLClassLoader=(URLClassLoader)ClassLoader.getSystemClassLoader();
    URL[]URL=urlClassLoader.getURLs();
    用于(URL:URL)
    {
    File File=新文件(url.getFile());
    if(file.getPath().endsWith(jarFile.getName()))
    {
    System.out.println(jarFile.getAbsolutePath()+“在类路径上”);
    返回true;
    }
    }
    返回false;
    }
    
    我有同样的问题,我解决了它

    将此存储库放在pom文件中

       <repository>
           <id>codelds</id>
           <url>https://code.lds.org/nexus/content/groups/main-repo</url>
        </repository>
    
    
    科德尔
    https://code.lds.org/nexus/content/groups/main-repo
    
    然后添加依赖项

     <!-- ORACLE JDBC driver, need install yourself -->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.1.0</version>
        </dependency>
    
    
    com.oracle
    ojdbc6
    11.2.0.1.0
    
    您可以使用将JAR嵌入包中。 这还将负责在清单中添加正确的OSGi头

    <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <extensions>true</extensions>
        <configuration>
            <instructions>
                <Embed-Dependency>ojdbc6</Embed-Dependency>
            </instructions>
        </configuration>
    </plugin>
    
    
    org.apache.felix
    maven捆绑插件
    真的
    ojdbc6
    

    无论如何,这不是一个好办法。我建议使用JPA或将Oracle JDBC驱动程序添加到
    lib/
    文件夹中,并通过系统包导出它们。

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

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

    我假设jar在类路径上,并且服务已经重新启动了?您可以试着运行
    Class.forName(“oracle.jdbc.driver.OracleDriver”)首次连接尝试之前的任何位置?这将有望创建一个新的驱动程序实例。请参阅第二种方法的说明,这是我强烈建议的。这是处理公共回购协议未提供的第三方LIB的专业方法。只有当这真的不起作用时,我们才应该讨论第三个问题,这实际上是一个糟糕的解决办法。但实际上只有到那时。也许Oracle本身也提供了一个有用的信息:
    
    <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <extensions>true</extensions>
        <configuration>
            <instructions>
                <Embed-Dependency>ojdbc6</Embed-Dependency>
            </instructions>
        </configuration>
    </plugin>
    
    osgi:install -s wrap:mvn:groupid/artifactid/version