前段

Maven Shadeプラグイン便利ですね。
長ったらしいクラスパスを書かなくても、jarファイル一発でプログラム起動できます。

そんなjarファイルに、Microsoft SQL ServerのJDBCドライバを入れようとして起きたことです。

やったこと

  • sqljdbc4.jarをダウンロードしてきて、ローカルのMavenレポジトリに格納しました。
  • pom.xmlに先のsqljdbc4.jarへの依存性を記載しました。
  • shadeプラグインでひとつのjarにまとめるようにしました。

起きたこと

実行すると、こんなエラーで落ちました。

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes 

同じ問題にあたっているひと → https://social.msdn.microsoft.com/Forums/sqlserver/en-US/f5c69fee-8c68-4601-bfcb-376e21dfa809/sql-server-jdbc-javalangsecurityexception-invalid-signature-file-digest?forum=sqldataaccess

原因

sqljdbc4.jarの中に署名が入っているから?

ぜんぜんわかってないです。

解決策

sqljdbc4.jarに含まれている署名ファイル(?)を、最終jarに含めないようにします。

pom.xml

(snip)
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
(snip)
                <configuration>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
(snip)

ひとりごと

Javaがjarファイルをどのように扱って実行しているのか、理解しないとですね。。。