Tập tin chữ ký không hợp lệ thành công khi cố gắng chạy một .jar


450

Chương trình java của tôi được đóng gói trong tệp jar và sử dụng thư viện jar bên ngoài, lâu đài bouncy . Mã của tôi biên dịch tốt, nhưng chạy jar dẫn đến lỗi sau:

Ngoại lệ trong luồng "chính" java.lang.SecurityException: Thông báo tệp chữ ký không hợp lệ cho các thuộc tính chính của tệp kê khai

Tôi đã googled trong hơn một giờ để tìm kiếm một lời giải thích và tìm thấy rất ít giá trị. Nếu bất cứ ai đã thấy lỗi này trước đây và có thể cung cấp một số trợ giúp, tôi sẽ có nghĩa vụ.


1
bạn đang cố gắng để ký bình của riêng bạn? Nếu vậy, làm thế nào bạn đang cố gắng để ký nó?
Cogsy

Không, ít nhất tôi không nghĩ rằng tôi là. Xcode có thể đang cố gắng tự ký, nhưng dường như không có bất kỳ cài đặt nào để tắt tính năng này.

đừng quên kiểm tra xem các lọ chứa giao diện đã triển khai có được ký hay không!
bò tót

Câu trả lời:


47

Các giải pháp được liệt kê ở đây có thể cung cấp một con trỏ.

Thông báo tệp chữ ký không hợp lệ cho các thuộc tính chính của tệp kê khai

Dòng dưới cùng:

Có lẽ tốt nhất là giữ jar chính thức như hiện tại và chỉ cần thêm nó như một phụ thuộc trong tệp kê khai cho tệp jar ứng dụng của bạn.


3
Làm thế nào tôi sẽ phản ánh điều này trong tệp kê khai? Tôi chưa bao giờ chỉnh sửa nó trước đây. Tôi đang sử dụng Xcode và quy ước chung là đặt các thư viện jar bên ngoài vào thư mục myproject / lib để đưa vào, đó là những gì tôi đang làm.

@ user123003 .. như trường hợp của Intelli-J
MikeM

13
Thật không may, một số người trong chúng ta sử dụng những thứ như "maven bóng râm", do đó, bao gồm các bản sao nguyên văn của bình gốc không dễ dàng như vậy trong những trường hợp đó ...
rogerdpack

không biết xấu hổ cắm để trả lời trên trang web này : stackoverflow.com/a/30922181/448779
foo

Điều gì về maven-assembly-plugin? Nó giải quyết vấn đề này trong trường hợp của tôi
jhenya-d

1083

Đối với những người gặp lỗi này khi cố gắng tạo uber-jar với maven-shade-plugin, giải pháp là loại trừ các tệp chữ ký kê khai bằng cách thêm các dòng sau vào cấu hình 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>
    <!-- Additional configuration. -->
</configuration>

9
Tôi đã sử dụng phương pháp này cho uber-jar của mình và nó hoạt động rất tốt. Có một ví dụ POM đầy đủ tại maven.apache.org/plugins/maven-shade-plugin/examples/ tựa cho thấy phương pháp này lọc các tệp được bao gồm.
M. Dudley

4
Tôi đã cố gắng bắt đầu một chủ đề hoàn toàn mới - nhưng vì đây là số 1 trong kết quả của Google - có vẻ thích hợp để giữ nó ở đây. Các dòng được liệt kê ở đây nằm trong tệp POM tôi đang sử dụng - và tôi vẫn gặp lỗi bảo mật khi chạy ứng dụng. Nó xây dựng tốt - và tất nhiên chạy tốt khi KHÔNG làm một bình Uber - như mong đợi. Và trong khi đó chắc chắn là một lựa chọn - hãy tách chúng ra - nó không giải quyết được vấn đề nếu bạn muốn có Uber Jar.
Gavin Baumanis

7
Điều này làm việc cho tôi nhưng ... tại sao chúng ta phải bỏ qua các tập tin chữ ký? Tôi chắc chắn rằng bản kê khai chữ ký là có lý do ....
Jeryl Cook

4
Hãy chắc chắn để làm "mvn sạch" sau khi làm ở trên!
codeinjuice

4
@JerylCook Các tệp chữ ký ở đó để chỉ ra rằng nội dung của tệp này có các tệp này. Khi bạn tạo một bình uber, bạn đang thêm một loạt các tệp vào bình và do đó chữ ký không chính xác. Nếu bạn thực sự muốn, bạn có thể ký lại bình mới, nhưng tất nhiên đó là bằng chữ ký của bạn chứ không phải chữ ký cũ. Ngoài ra, bạn không thể phân phối jar uber, mà thay vào đó bao gồm jar đã ký dưới dạng một tệp riêng biệt, nhưng sau đó đánh bại mục đích của jar uber ở vị trí đầu tiên.
LadyCailin

139

Đối với những người sử dụng gradle và cố gắng tạo và sử dụng một lọ mỡ, cú pháp sau đây có thể giúp ích.

jar {
    doFirst {
        from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
    }
    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' 
}

1
Điều này về cơ bản chỉ loại trừ tất cả các tệp có phần mở rộng của .RSA, .SF hoặc .DSA trong thư mục META-INF.
Keith P

9
Việc ký một tệp jar sẽ thêm các tệp này theo META-INF, nhưng khi chúng được bao gồm, các chữ ký không còn đồng ý với nội dung jar. Do đó loại bỏ chúng tránh sự không phù hợp chữ ký.
Peter N. Steinmetz

1
Có một câu hỏi tương tự nghiêm ngặt về việc sử dụng bình mỡ trong lớp - stackoverflow.com/questions/4871656/
mẹo

3
Điều này đã không làm việc cho tôi. Tôi phải đặt nhiệm vụ excludecủa mình fatJar, trong đó có configurations.compile.collectlệnh đó . Xem stackoverflow.com/a/31426413/103412
Torsten

1
Điều này cũng giải quyết được lỗiError: Could not find or load main class App Caused by: java.lang.ClassNotFoundException: App
vonox7

57

Một số phụ thuộc của bạn có khả năng ký tên jarfiles. Khi bạn kết hợp tất cả chúng vào một nhóm lớn, các tệp chữ ký tương ứng vẫn còn và không còn phù hợp với nhóm "kết hợp lớn", do đó thời gian chạy tạm dừng nghĩ rằng tệp jar đã bị giả mạo (mà nó ... đã làm như vậy nói).

Bạn có thể giải quyết vấn đề bằng cách loại bỏ các tệp chữ ký khỏi phần phụ thuộc của nhóm. Thật không may, không thể làm điều này trong một bước trong kiến .

Tuy nhiên, tôi đã có thể làm cho điều này hoạt động với Ant theo hai bước, mà không cần đặt tên cụ thể cho từng phụ thuộc của nhóm, bằng cách sử dụng:

<target name="jar" depends="compile" description="Create one big jarfile.">
    <jar jarfile="${output.dir}/deps.jar">
        <zipgroupfileset dir="jars">
            <include name="**/*.jar" />
        </zipgroupfileset>
    </jar>
    <sleep seconds="1" />
    <jar jarfile="${output.dir}/myjar.jar" basedir="${classes.dir}">
        <zipfileset src="${output.dir}/deps.jar" excludes="META-INF/*.SF" />
        <manifest>
            <attribute name="Main-Class" value="com.mycompany.MyMain" />
        </manifest>
    </jar>
</target>

Phần tử ngủ được cho là để ngăn lỗi về các tệp có ngày sửa đổi trong tương lai .

Các biến thể khác tôi tìm thấy trong các chủ đề được liên kết đã không làm việc cho tôi.


Bạn có thể thực hiện trong một bước, sử dụng một cách khác để chỉ định các tệp của bạn: <jar Destfile = "build / myjar.jar"> <hạn chế> <không> <name name = "META-INF / *. SF" /> </ not> <archives> <zips> <fileset dir = "jarfolder" gồm = " * / .jar" /> </ zips> </ archives> </
rict

57

Vui lòng sử dụng lệnh sau

zip -d yourjar.jar 'META-INF/*.SF' 'META-INF/*.RSA' 'META-INF/*SF'

4
Cảm ơn bạn, tôi đã có vấn đề này với intellij 14 và giải pháp của bạn làm việc cho tôi!
Mohamad Kouhi Moghadam

5
Cảm ơn bạn, đã làm việc cho tôi trong Windows. Chỉ cần mở jar bằng 7zip, đã xóa các tệp .SF. Tôi không có bất kỳ tệp .RSA nào để xóa
candino 22/03/2017

3
Ồ, tôi chỉ có thể nói giải pháp này thật tuyệt vời (và tôi đã học được điều gì đó rất mạnh mẽ trên đường đi!) Điều này cần nâng cao hơn nữa.
Dylan_Larkin

Tôi đồng ý với nhận xét của @Dylan_Larkin, đây là điều đã giải quyết nó cho tôi.
Felipe Valdes

26

Tôi gặp vấn đề này khi sử dụng IntelliJ IDEA 14.01.

Tôi đã có thể sửa nó bằng cách:

Tệp-> Cấu trúc dự án-> Thêm mới (Tạo tác) -> jar-> Từ mô-đun có phụ thuộc vào Tạo Jar từ cửa sổ mô-đun:

Chọn bạn lớp chính

Tệp JAR từ Thư viện Chọn sao chép vào thư mục đầu ra và liên kết qua tệp kê khai


2
Có thể đặt các lọ phụ thuộc vào bình mục tiêu không?
coder.chenzhi

giải pháp của bạn hoạt động tốt !! cảm ơn nhiều!
hzitoun

19

Bảo mật đã là một chủ đề khó khăn, nhưng tôi thất vọng khi thấy giải pháp phổ biến nhất là xóa chữ ký bảo mật. JCE yêu cầu những chữ ký này . Bóng Maven phát nổ tệp jar BouncyCastle đặt chữ ký vào META-INF, nhưng chữ ký BouncyCastle không hợp lệ đối với một jar mới, chỉ (đối với jar BC) và đó là nguyên nhân gây ra lỗi chữ ký không hợp lệ trong luồng này .

Có, loại trừ hoặc xóa các chữ ký theo đề xuất của @ruhsuzbaykus thực sự làm cho lỗi ban đầu biến mất, nhưng nó cũng có thể dẫn đến các lỗi mới, khó hiểu về mật mã:

java.security.NoSuchAlgorithmException: PBEWithSHA256And256BitAES-CBC-BC SecretKeyFactory not available

Bằng cách chỉ định rõ ràng nơi tìm thuật toán như thế này:

SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC","BC");

Tôi đã có thể nhận được một lỗi khác nhau:

java.security.NoSuchProviderException: JCE cannot authenticate the provider BC

JCE không thể xác thực nhà cung cấp vì chúng tôi đã xóa chữ ký điện tử bằng cách làm theo đề xuất ở nơi khác trong cùng chủ đề này .

Giải pháp tôi tìm thấy là plugin đóng gói thực thi sử dụng cách tiếp cận jar-in-jar để giữ chữ ký BouncyCastle trong một jar có thể thực thi được.

CẬP NHẬT :

Một cách khác để làm điều này (cách chính xác?) Là sử dụng người ký Maven Jar . Điều này cho phép bạn tiếp tục sử dụng bóng Maven mà không gặp lỗi bảo mật. TUY NHIÊN, bạn phải có chứng chỉ ký mã (Oracle khuyên bạn nên tìm kiếm "Chứng chỉ ký mã Java"). Cấu hình POM trông như thế này:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
            <configuration>
                <filters>
                    <filter>
                        <artifact>org.bouncycastle:*</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.ManifestResourceTransformer">
                        <mainClass>your.class.here</mainClass>
                    </transformer>
                </transformers>
                <shadedArtifactAttached>true</shadedArtifactAttached>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jarsigner-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <id>sign</id>
            <goals>
                <goal>sign</goal>
            </goals>
        </execution>
        <execution>
            <id>verify</id>
            <goals>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <keystore>/path/to/myKeystore</keystore>
        <alias>myfirstkey</alias>
        <storepass>111111</storepass>
        <keypass>111111</keypass>
    </configuration>
</plugin>

Không, không có cách nào để JCE nhận ra chứng chỉ tự ký, vì vậy nếu bạn cần bảo quản các loại giấy BouncyCastle, bạn phải sử dụng plugin jar-in-jar hoặc lấy chứng chỉ JCE.


Đây chắc chắn là cách đúng đắn để làm điều đó, ngay cả khi nó làm việc chuyên sâu. Cảm ơn đã chỉ ra, một cách chi tiết, hãy cẩn thận với việc sử dụng câu trả lời đã được phê duyệt. Bạn có biết chứng chỉ JCE phải được ký bởi Sun không? Hoặc có thể
WiteCastle

1
Có các bên thứ ba có thể phát hành ký mã xác nhận. Tìm kiếm "Chứng chỉ ký mã Java" để xem các tùy chọn.
MattW

Bạn, thưa ngài, đã làm cho ngày của tôi!
socona

Giúp tôi với. Có một số tệp trong thư viện này mà tôi không sử dụng, vì vậy ngoại trừ chúng giúp tôi với tệp fat-jar
Saidolim

14

Tôi đã đối mặt với cùng một vấn đề, sau khi tham khảo ở đâu đó, nó đã thay đổi như sau:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.1</version>
    <configuration>
        <createDependencyReducedPom>false</createDependencyReducedPom>
    </configuration>
    <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>
            </configuration>
        </execution>
    </executions>
</plugin>

1
Điều này giải quyết vấn đề của tôi nhanh chóng! Để hoàn thiện, điều này nên đi trongmaven-shade-plugin thẻ.
Kuzeko

1
@Kuzeko Cập nhật anwser với đề xuất của bạn. Cảm ơn
m.nguyencntt 21/03/19

8

Giả sử bạn xây dựng tệp jar của mình bằng ant, bạn chỉ có thể hướng dẫn ant bỏ qua thư mục META-INF. Đây là phiên bản đơn giản hóa mục tiêu con kiến ​​của tôi:

<jar destfile="app.jar" basedir="${classes.dir}">
    <zipfileset excludes="META-INF/**/*" src="${lib.dir}/bcprov-jdk16-145.jar"></zipfileset>
    <manifest>
        <attribute name="Main-Class" value="app.Main"/>
    </manifest>
</jar>

Tôi nên thêm những dòng này vào đâu?
Addi.Star

4

Gần đây tôi đã bắt đầu sử dụng IntelliJ cho các dự án của mình. Tuy nhiên, một số đồng nghiệp của tôi vẫn sử dụng Eclipse trên cùng các dự án. Hôm nay, tôi đã gặp lỗi tương tự sau khi thực hiện tệp jar được tạo bởi IntelliJ. Mặc dù tất cả các giải pháp ở đây đều nói về gần như cùng một thứ, nhưng không có giải pháp nào làm việc cho tôi dễ dàng (có thể vì tôi không sử dụng ANT, maven build đã cho tôi các lỗi khác dẫn tôi đến http://cwiki.apache.org/ confluence / display / MAVEN / MojoExecutException , và tôi cũng không thể tự mình tìm ra những cái lọ đã ký là gì!)

Cuối cùng, điều này đã giúp tôi

zip -d demoSampler.jar 'META-INF/*.SF' 'META-INF/*.RSA' 'META-INF/*SF'

Đoán xem cái gì đã bị xóa khỏi tập tin jar của tôi?!

deleting: META-INF/ECLIPSE_.SF 
deleting: META-INF/ECLIPSE_.RSA

Có vẻ như vấn đề này có liên quan đến một số tập tin liên quan đến nhật thực.


4

Tôi gặp vấn đề tương tự gradlekhi tạo Jar chất béo, cập nhật build.gradletệp với dòng loại trừ đã khắc phục sự cố.

jar {
    from {
        configurations.compile.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
    manifest {
        attributes 'Main-Class': 'com.test.Main'
    }
}

1
Tôi đã gỡ lỗi trong nhiều ngày, điều này đã giải quyết vấn đề bình béo của tôi.
sysuser

Cách tôi gỡ lỗi là đặt jar chất béo trong thư mục lib của jmeter. Nếu bạn gặp lỗi jar trong lib / ext, vấn đề này sẽ không rõ ràng, thay vào đó bạn sẽ gặp lỗi như trong stackoverflow.com/questions/37624187/
Lỗi

1
loại trừ 'META-INF / *. RSA', 'META-INF / *. SF', 'META-INF / *. DSA' Điều này bị thiếu, một số lọ phụ thuộc đã gây ra sự cố
Nirbhay Mishra

3

Trong trường hợp bạn đang sử dụng gradle, đây là một nhiệm vụ farJar đầy đủ:

version = '1.0'
//create a single Jar with all dependencies
task fatJar(type: Jar) {
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar File Example',  
            'Implementation-Version': version,
            'Main-Class': 'com.example.main'
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA' 
    with jar
}

2

So sánh thư mục META-INF trong bình mới với bình cũ (trước khi bạn thêm thư viện mới). Có khả năng sẽ có các tập tin mới. Nếu có, bạn có thể loại bỏ chúng. Nó sẽ giúp. Trân trọng, 999michal


2

Một chiến lược sẽ bao gồm việc sử dụng ANT để đơn giản hóa việc xóa chữ ký khỏi mỗi tệp Jar. Nó sẽ tiến hành các bước sau:

  1. Sao chép MANIFEST.MF trong một tệp tạm thời
  2. Xóa các mục TênSHA khỏi tệp tạm thời
  3. Tạo một tệp Jar tạm thời với tệp kê khai tạm thời
  4. Xóa bỏ bảng kê khai tạm thời
  5. Trao đổi tệp Jar gốc với tệp tạm thời

Đây là một macrodef ANT đang thực hiện công việc:

<macrodef name="unsignjar" description="To unsign a specific Jar file">
    <attribute name="jarfile" 
        description="The jar file to unsign" />
    <sequential>
<!-- Copying to the temporary manifest file -->
        <copy toFile="@{jarFile}_MANIFEST.tmp">
            <resources>
                <zipentry zipfile="@{jarFile}" name="META-INF/MANIFEST.MF"/>
            </resources>
        </copy>
<!-- Removing the Name and SHA entries from the temporary file -->
        <replaceregexp file="@{jarFile}_MANIFEST.tmp" match="\nName:(.+?)\nSH" replace="SH" flags="gis" byline="false"/>
        <replaceregexp file="@{jarFile}_MANIFEST.tmp" match="SHA(.*)" replace="" flags="gis" byline="false"/>
<!-- Creating a temporary Jar file with the temporary manifest -->
        <jar jarfile="@{jarFile}.tmp"
            manifest="@{jarFile}_MANIFEST.tmp">
            <zipfileset src="@{jarFile}">
                <include name="**"/>
                <exclude name="META-INF/*.SF"/>
                <exclude name="META-INF/*.DSA"/>
                <exclude name="META-INF/*.RSA"/>
            </zipfileset>
        </jar>
<!-- Removing the temporary manifest -->
        <delete file="@{jarFile}_MANIFEST.tmp" />
<!-- Swapping the original Jar file with the temporary one -->
        <move file="@{jarFile}.tmp"
              tofile="@{jarFile}"
              overwrite="true" />
</sequential>

`

Định nghĩa sau đó có thể được gọi theo cách này trong một nhiệm vụ ANT:

<target name="unsignJar">
    <unsignjar jarFile="org.test.myjartounsign.jar" />
</target>

2

Xảy ra lỗi 314) tại sun.security.util.SignatureFileVerifier. Process (SignatureFileVerifier.java:268) tại java.util.jar.JarVerifier. ProcessEntry (JarVerifier.java:316) tại java.util.jar.JarVerifier.update (JarVerifier.update : 228) tại java.util.jar.JarFile.initializeVerifier (JarFile.java:383) tại java.util.jar.JarFile.getInputStream (JarFile.java:450) tại sun.misc.URLClassPath $ JarLoader $ 2.getIn .java: 977) tại sun.misc.Resource.cachedInputStream (Resource.java:77) tại sun.misc.Resource.getByteBuffer (Resource.java:160) tại java.net.URLClassLoader.defineClass (URLClassLoader.java:454) tại java.net.URLClassLoader.access $ 100 (URLClassLoader.java:73) tại java.net.URLClassLoader $ 1.run (URLClassLoader java.net.URLClassLoader $ 1.run (URLClassLoader.java:362) tại java.security.AccessContoder.doPriv đặc biệt (Phương thức gốc) tại java.net.URLClassLoader.findClass (URLClassLoader.java:361) tại java. (ClassLoader.java:424) tại sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:331) tại java.lang.ClassLoader.loadClass (ClassLoader.java:357) tại sun.launcher.LauncherHelper.check java: 495)chạy (URLClassLoader.java:368) tại java.net.URLClassLoader $ 1.run (URLClassLoader.java:362) tại java.security.AccessContoder.doPriv đặc biệt (Phương thức gốc) tại java.net.URLClassLoader.findClass ) tại java.lang.ClassLoader.loadClass (ClassLoader.java:424) tại sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:331) tại java.lang.ClassLoader.loadClass (ClassLoader.java:357) .launcher.LauncherHelper.checkAndLoadMain (LauncherHelper.java:495)chạy (URLClassLoader.java:368) tại java.net.URLClassLoader $ 1.run (URLClassLoader.java:362) tại java.security.AccessContoder.doPriv đặc biệt (Phương thức gốc) tại java.net.URLClassLoader.findClass ) tại java.lang.ClassLoader.loadClass (ClassLoader.java:424) tại sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:331) tại java.lang.ClassLoader.loadClass (ClassLoader.java:357) .launcher.LauncherHelper.checkAndLoadMain (LauncherHelper.java:495)331) tại java.lang.ClassLoader.loadClass (ClassLoader.java:357) tại sun.launcher.LauncherHelper.checkAndLoadMain (LauncherHelper.java:495)331) tại java.lang.ClassLoader.loadClass (ClassLoader.java:357) tại sun.launcher.LauncherHelper.checkAndLoadMain (LauncherHelper.java:495)

Điều gì đã giúp tôi (IntelliJ IDEA 2016.3): Tệp -> Cấu trúc dự án -> Tạo tác -> Thêm JAR -> Chọn Lớp chính -> Chọn "sao chép vào thư mục đầu ra và liên kết qua tệp kê khai" -> OK -> Áp dụng -> Xây dựng - > Xây dựng tạo tác ... -> Xây dựng



1

Nếu bạn đang tìm kiếm một giải pháp Fat JAR mà không giải nén hoặc giả mạo các thư viện gốc nhưng với một trình nạp lớp JAR đặc biệt, hãy xem dự án của tôi ở đây .

Tuyên bố miễn trừ trách nhiệm: Tôi không viết mã, chỉ gói nó và xuất bản nó trên Maven Central và mô tả trong phần đọc của tôi cách sử dụng nó.

Cá nhân tôi sử dụng nó để tạo các JAR uber có thể chạy có chứa các phụ thuộc BouncyCastle. Có lẽ nó cũng hữu ích cho bạn.


0

Đối với những người gặp rắc rối với giải pháp được chấp nhận, có một cách khác để loại trừ tài nguyên khỏi jar được tô bóng bằng DontIncludeResourceTransformer:

https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#DontIncludeResourceTransformer

          <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                <resource>BC1024KE.DSA</resource>
            </transformer>
          </transformers>

Từ Shadow 3.0, máy biến áp này chấp nhận một danh sách các tài nguyên. Trước đó, bạn chỉ cần sử dụng nhiều biến áp mỗi biến với một tài nguyên.


0

Điều này đã xảy ra với tôi ở Intellij khi tôi nhấp vào "Thêm dưới dạng Dự án Maven" ở dòng dưới cùng khi Intellij nói "tìm thấy các tệp pom không được quản lý." Trong khi đó thư mục out đã được tạo. Vì vậy, nó đã không nhận được những thay đổi gần đây.

Xóa thư mục và chạy chương trình đã giải quyết vấn đề cho tôi. thư mục ra sau đó đã được tạo lại.

Xem câu trả lời của Little Fox là tốt. Lỗi tôi nhận được rất giống với anh ấy.


-1

Tôi đã có một vấn đề tương tự. Lý do là tôi đã biên dịch bằng cách sử dụng JDK với JRE khác với JRE mặc định trong hộp Windows của tôi.

Sử dụng java.exe chính xác đã giải quyết vấn đề của tôi.


-2

Nếu bạn nhận được điều này khi cố gắng liên kết các tệp JAR cho dự án liên kết Xamarin.Android như vậy:

JARTOXML: cảnh báo J2XA006: lỗi lớp bị thiếu đã được nêu ra trong khi phản ánh com.your. Class: Thông báo tệp chữ ký không hợp lệ cho các thuộc tính chính của Manifest

Chỉ cần mở các tệp JAR bằng Winzip và xóa các thư mục meta-inf. Xây dựng lại - công việc đã hoàn thành


1
Đây là một kỹ thuật khủng khiếp. Hoàn toàn khủng khiếp. Thực hiện chỉnh sửa tại địa phương không thực hiện thay đổi đối với các lọ đến
sinisterrook
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.