2015-02-06 52 views
0

我正在尝试编写一个maven脚本,它使用sql-maven-plugin删除并重新创建Oracle TimesTen数据库,然后使用dbdeploy应用一些数据库迁移脚本在预集成测试阶段。多个Maven插件依赖关系 - 本地库已经加载到另一个类加载器

这些插件,都需要使用它当然不能由不同的类加载器加载,产生以下错误本地的TimesTen库:

[ERROR] 
java.sql.SQLException: Problems with loading native library/missing methods: Native Library /opt/timesten/TimesTen/tt1122/lib/libttJdbcCS.dylib already loaded in another classloader 

我如何在Maven中克服这些问题,特别是?

仅供参考,我的pom.xml如下所示:

<?xml version="1.0"?> 
<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> 

    <parent> 
     <groupId>com.xxx.xxx</groupId> 
     <artifactId>xxx</artifactId> 
     <version>x.x.x.x-SNAPSHOT</version> 
    </parent> 

    <groupId>x.x.x.x</groupId> 
    <artifactId>db-reset</artifactId> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>com.dbdeploy</groupId> 
       <artifactId>maven-dbdeploy-plugin</artifactId> 
       <version>3.0M3</version> 

       <configuration> 
        <scriptdirectory>src/sql/dbdeploy-migrations</scriptdirectory> 
        <driver>${timesten.jdbc.driver.class}</driver> 
        <url>${timesten.jdbc.url}</url> 
        <userid>${timesten.user}</userid> 
        <password>${timesten.password}</password> 
        <dbms>timesten</dbms> 
        <delimiter>;</delimiter> 
        <delimiterType>row</delimiterType> 
       </configuration> 

       <dependencies> 
        <dependency> 
         <groupId>com.timesten</groupId> 
         <artifactId>timesten</artifactId> 
         <version>11.2.2.7.8</version> 
         <scope>system</scope> 
         <systemPath>${timesten.jdbc.library.path}</systemPath> 
        </dependency> 
       </dependencies> 

       <executions> 
        <execution> 
         <phase>pre-integration-test</phase> 
         <goals> 
          <goal>update</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>sql-maven-plugin</artifactId> 
       <configuration> 
        <driver>${timesten.jdbc.driver.class}</driver> 
        <url>${timesten.jdbc.url}</url> 
        <username>${timesten.user}</username> 
        <password>${timesten.password}</password> 
       </configuration> 
       <dependencies> 
        <dependency> 
         <groupId>com.timesten</groupId> 
         <artifactId>timesten</artifactId> 
         <version>11.2.2.7.8</version> 
         <scope>system</scope> 
         <systemPath>${timesten.jdbc.library.path}</systemPath> 
        </dependency> 
       </dependencies> 
       <executions> 
        <execution> 
         <id>drop-db</id> 
         <phase>clean</phase> 
         <goals> 
          <goal>execute</goal> 
         </goals> 
         <configuration> 
          <onError>continue</onError> 
          <srcFiles> 
           <srcFile>src/sql/base/drop.sql</srcFile> 
          </srcFiles> 
         </configuration> 
        </execution> 
        <execution> 
         <id>create-clean-db</id> 
         <phase>clean</phase> 
         <goals> 
          <goal>execute</goal> 
         </goals> 
         <configuration> 
          <srcFiles> 
           <srcFile>src/sql/base/create.sql</srcFile> 
          </srcFiles> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

回答

0

如果这仍是有趣:你可以通过创建一个小的Maven的插件与魔,什么也不做,但解决的Class.forName这个()插件类。创建一个META-INF/maven/extensions.xml文件,将该驱动程序的包作为扩展名导出。很早(例如在初始化过程中)运行该插件和specifiy

<extensions>true</extensions> 

实际上,延伸创建通过一次加载驱动程序类(和一次加载本地库)的所有插件共享的类加载器。

相关问题