jar内の一部のファイルが依存パッケージによって上書きされてしまうのを防ぎたい

投稿者: Anonymous

既存のjdbcの挙動を変えたくて、独自のラッパーjdbcを作成しているのですが、Mavenでjarを作成する際に META-INF/services/java.sql.Driverファイルが既存のjdbcパッケージに入ってるjava.sql.Driverファイルで上書きされてしまいます。
これを防ぐ手立てはあるのでしょうか?

今回作成するjdbcの呼び出し側は改変不可能なアプリケーションのため、Class.forNameで自作クラスを指定できません。jdbc ver4.0の仕様上、必ず META-INF/services/java.sql.Driverファイルに自作クラスが指定されている必要があると考えています。

Maven実行後に作成されたjarファイルに対してjarコマンドでファイルの上書きを行えば期待したjdbcが作成されるのですが、できればMavenだけで完了させたいです。

解決

あるMavenモジュールのリソースの一部(あるいは全部)を取り込んで新しいモジュールを作る場合、 maven-shade-pluginが利用できると思います。

<dependencies>
  <dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.2.5</version>
    <optional>true</optional>
  </dependency>
</dependencies>

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>3.2.1</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <filters>
              <filter>
                <artifact>org.postgresql:postgresql:*</artifact>
                <excludes>
                  <exclude>META-INF/services/java.sql.Driver</exclude>
                </excludes>
              </filter>
            </filters>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *