読者です 読者をやめる 読者になる 読者になる

Maven JAR で、SecurityException

Maven で作成した jar ファイルを実行した時に、以下のエラーが発生

Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
at sun.security.util.SignatureFileVerifier.processImpl(Unknown Source)
at sun.security.util.SignatureFileVerifier.process(Unknown Source)
at java.util.jar.JarVerifier.processEntry(Unknown Source)
at java.util.jar.JarVerifier.update(Unknown Source)
at java.util.jar.JarFile.initializeVerifier(Unknown Source)
   :
   :

Mavenのplugin , mvena-shade-pluginjar を作った時、META-INF の下に、RSA鍵ファイル等を作ってしまったため。

SQLServer に接続するJavaプログラムを作っていて起きてしまった。
jar 作成時、META-INF の下にこれら RSAファイルなど、sqljdbc4.jar の中に入ってたものを持ってきてしまう。
解決のためにこれらうを除外してJARを作成するようにするには、pom.xml plugin configuration の中に以下を書く。

<filters>
   <filter>
      <artifact>*:*</artifact>
      <excludes>
          <exclude>META-INF/*.SF</exclude>
          <exclude>META-INF/*.DSA</exclude>
          <exclude>META-INF/*.RSA</exclude>
       </excludes>
    </filter>
</filters>


注意が必要なのは、使用する mvena-shade-plugin のバージョンが古い= 1.2.4 ではダメで、最新を使うべき。
2.4.1 でうまくいった。
pom.xmlplugin は、このようになる。

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-shade-plugin</artifactId>
   <version>2.4.1</version>
   <executions>
      <execution>
         <phase>package</phase>
         <goals>
            <goal>shade</goal>
         </goals>

         <configuration>
            <finalName>foo-watch</finalName>
            <transformers>
               <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>org.FooWatchMain</mainClass>
               </transformer>
            </transformers>
            <filters>
               <filter>
                  <artifact>*:*</artifact>
                  <excludes>
                     <exclude>META-INF/*.SF</exclude>
                     <exclude>META-INF/*.DSA</exclude>
                     <exclude>META-INF/*.RSA</exclude>
                  </excludes>
               </filter>
            </filters>

         </configuration>
      </execution>
   </executions>

</plugin>