Maven不包括Jar文件中的依赖项

时间:2016-08-27 17:33:24

标签: java maven jdbc neo4j

我正在尝试使用neo4j-jdbc-driver v3.0连接到Neo4j 2.2.10服务器。我能够在IDE中没有任何问题地连接,但是当我尝试从Jar文件中执行相同操作时,我得到一个没有合适的驱动程序发现异常,就像依赖项不可用一样。

java.sql.SQLException: No suitable driver found for jdbc:neo4j:http://localhost
    at java.sql.DriverManager.getConnection(DriverManager.java:689)
    at java.sql.DriverManager.getConnection(DriverManager.java:270)
    ....

以下是我的pom.xml的相关部分:

<dependencies>    
  <dependency>
    <groupId>org.neo4j</groupId>
    <artifactId>neo4j-jdbc-driver</artifactId>
    <version>3.0</version>
  </dependency>
</dependencies>

<build>    
  <plugins>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
      </configuration>
    </plugin>
  </plugins>
</build>

我研究了在论坛的其他地方加入Maven的依赖关系,这就是插件的来源。但是,我认为它不包括基于错误的依赖。

以前,我正在使用:

<dependency>
  <groupId>org.neo4j.driver</groupId>
  <artifactId>neo4j-java-driver</artifactId>
  <version>1.0.4</version>
</dependency>

我能够通过jar中的螺栓与v3.0.3 Neo4j服务器进行交互,没有任何问题。

我做错了什么?

感谢您的任何建议!

1 个答案:

答案 0 :(得分:1)

您可以验证驱动程序是否包含在生成的工件中(假设其名称为assembly.jar):

jar tf target/assembly.jar | fgrep jdbc

但可能是这样。

我认为问题来自于使用服务提供程序接口(SPI)自动注册驱动程序,方法是列出META-INF/services/java.sql.Driver中的类。但是,因为程序集插件将依赖项jar包装在程序集jar中而不是爆炸它们并创建一个超级jar(就像树荫插件一样),所以不会扫描SPI文件。例如,请参阅this blog post

我建议您尝试使用树荫插件,配置ServicesResourceTransformer

<强>更新

如果SPI机制在您的上下文中不起作用(jar由容器应用程序作为插件加载),您可以自己注册驱动程序,如果在使用驱动程序之前在您知道的代码中有一个位置(一些插件的初始化服务,例如,可能通过实现Plugin.onLoad()?):只需创建一个驱动程序的实例,它就会注册自己。

try {
    new org.neo4j.jdbc.http.HttpDriver();
} catch (SQLException e) {
    logger.error("Could not load HttpDriver for Neo4j", e);
}