Intellij打包jar文件,「java.lang.SecurityException: Invalid signature file digest for Manifest main attrib

下面是使用Intellij 打包jar文件的步驟,以後會有運行jar文件時遇到的錯誤。html

 

 

 

 

 

 

打包完成。java

==========================================================================spring

運行jar出現問題:apache

一、找不到主類。打開jar文件包,在MANIFEST.MF文件中添加Main-Class:  包名.類名,app

注意:包名前面有空格,類名沒有.java或者.class後綴,最後必定要回車到下一行。讓光標定位在空白行。eclipse

打開maven

 

二、java.lang.SecurityException: Invalid signature file digest for Manifest main attributeside

打開META-INF目錄,將*.SF,*.DSA,*.RSA文件刪除,便可。應爲有些包有簽名,致使錯誤。(2019-12-15親測可行)post

此問題,能夠參考下面的鏈接,這位大神比較詳細,http://www.cnblogs.com/fuxinci/p/3356087.html,(若有侵權請告知,會刪除,謝謝!)。ui

 

 

 

 

使用meaven打包過程當中遇到的一些問題

 

開始使用以下代碼進行打包

複製代碼
複製代碼
<build>
        <!-- mvn assembly:assembly -Dmaven.test.skip=true -->
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2-beta-5</version>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>com.fxc.rpc.impl.member.MemberProvider</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>assembly</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
複製代碼
複製代碼

 結果出現spring命名空間沒法找到的錯誤,

org.xml.sax.SAXParseException: schema_reference.4: 沒法讀取方案文檔 'http://www.springframework.org/schema/beans/spring-beans.xsd', 緣由爲 1) 沒法找到文檔; 2) 沒法讀取文檔; 3) 文檔的根元素不是 <xsd:schema>。

據查是因爲spring-core,spring-aop每個jar中都包含了一套spring.handlers,spring.schemas文件,以致於在打包過程當中發生了覆蓋,網上沒有搜到使用maven-assembly-plugin插件如何解決此問題,大多數人建議使用maven-shade-plugin插件,修改後pom代碼以下

複製代碼
複製代碼
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <transformers>
                    <transformer
                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/spring.handlers</resource>
                    </transformer>
                    <transformer
                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>com.fxc.rpc.impl.member.MemberProvider</mainClass>
                    </transformer>
                    <transformer
                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                        <resource>META-INF/spring.schemas</resource>
                    </transformer>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>
複製代碼
複製代碼

再次打包,出現文件簽名不合法的問題

Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

再查,原來是因爲某些包的重複引用,以致於打包以後的META-INF的目錄下多出了一些*.SF,*.DSA,*.RSA文件所致(聽說解壓jar包,而後刪掉這些文件再次打包錯誤就會消失,未確認),再次修改pom.xml,最終使用以下配置文件,運行

mvn clean install -Dmaven.test.skip=true

打包成功

複製代碼
複製代碼
<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.4</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <filters>
                            <filter>
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/*.SF</exclude>
                                    <exclude>META-INF/*.DSA</exclude>
                                    <exclude>META-INF/*.RSA</exclude>
                                </excludes>
                            </filter>
                        </filters>

                        <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.handlers</resource>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.fxc.rpc.impl.member.MemberProvider</mainClass>
                            </transformer>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.schemas</resource>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
複製代碼
複製代碼

此時查看target目錄下會發現xxx.jar 和original-xxx.jar,後一個不包含引用的jar包,直接運行前一個便可

java -jar target/xxx.jar

成功!

PS:項目中使用了幾個公司本身的jar,在公有庫裏沒有,在eclipse裏運行的時候我都是修改scope爲system,調用的本地jar,可是在打包的過程當中scope=system的jar是不會本身打進去的,非常讓我鬱悶,我只好講這些jar安裝進入本地資源庫

mvn install:install-file -Dfile=my-jar.jar -DgroupId=org.richard -DartifactId=my-jar -Dversion=1.0 -Dpackaging=jar
相關文章
相關標籤/搜索