Mój program Java jest spakowany w pliku jar i korzysta z zewnętrznej biblioteki jar, nadmuchiwany zamek . Mój kod kompiluje się poprawnie, ale uruchomienie jar prowadzi do następującego błędu:
Wyjątek w wątku „main” java.lang.SecurityException: Niepoprawne podsumowanie pliku sygnatury dla głównych atrybutów manifestu
Przez ponad godzinę szukałem wyjaśnień i znalazłem niewiele wartości. Gdyby ktoś widział ten błąd i mógł zaoferować pomoc, byłbym zobowiązany.
Odpowiedzi:
Wymienione tutaj rozwiązanie może zapewnić wskaźnik.
Dolna linia:
źródło
Dla tych, którzy dostali ten błąd podczas próby utworzenia uber-słoik z
maven-shade-plugin
, rozwiązaniem jest wykluczenie oczywistych plików sygnatur dodając następujące wiersze do konfiguracji pluginu:źródło
Dla tych, którzy używają gradle i próbują utworzyć i użyć grubego słoika, pomocna może być następująca składnia.
źródło
exclude
wykonać swojefatJar
zadanie, które miało toconfigurations.compile.collect
polecenie. Zobacz stackoverflow.com/a/31426413/103412Error: Could not find or load main class App Caused by: java.lang.ClassNotFoundException: App
Niektóre z Twoich zależności są prawdopodobnie podpisanymi plikami jar. Kiedy połączysz je wszystkie w jeden duży plik jar, odpowiednie pliki sygnatur są nadal obecne i nie pasują już do „dużego połączonego” pliku jar, więc środowisko wykonawcze przestaje myśleć, że plik jar został sfałszowany (który ... musi to zrobić mówić).
Możesz rozwiązać problem, eliminując pliki sygnatur z zależności plików jar. Niestety nie można tego zrobić w jednym kroku .
Udało mi się to jednak uzyskać dzięki Antowi w dwóch krokach, bez konkretnej nazwy każdej zależności pliku jar, używając:
Element uśpienia ma zapobiegać błędom dotyczącym plików z datami modyfikacji w przyszłości .
Inne odmiany, które znalazłem w połączonych wątkach, nie działały dla mnie.
źródło
Użyj następującego polecenia
źródło
Miałem ten problem podczas korzystania z IntelliJ IDEA 14.01.
Byłem w stanie to naprawić:
Plik-> Struktura projektu-> Dodaj nowy (artefakty) -> jar-> Z modułów z zależnościami w oknie Utwórz jar z modułu:
Wybierz swoją główną klasę
Plik JAR z bibliotek Wybierz kopię do katalogu wyjściowego i połącz poprzez manifest
źródło
Bezpieczeństwo to już trudny temat, ale jestem rozczarowany, widząc, że najpopularniejszym rozwiązaniem jest usunięcie sygnatur bezpieczeństwa. JCE wymaga tych podpisów . Odcień Maven wybucha plik jar BouncyCastle, który umieszcza podpisy w META-INF, ale podpisy BouncyCastle nie są ważne dla nowego jar-uber-jar (tylko dla jar BC), i to powoduje błąd nieprawidłowego podpisu w tym wątku .
Tak, wykluczenie lub usunięcie podpisów zgodnie z sugestią @ruhsuzbaykus rzeczywiście powoduje zniknięcie pierwotnego błędu, ale może również prowadzić do nowych, tajemniczych błędów:
Określając wprost, gdzie znaleźć taki algorytm:
Byłem w stanie uzyskać inny błąd:
JCE nie może uwierzytelnić dostawcy, ponieważ usunęliśmy podpisy kryptograficzne , postępując zgodnie z sugestią w innym miejscu tego samego wątku .
Rozwiązaniem, które znalazłem, była wykonywalna wtyczka pakująca, która wykorzystuje podejście jar-in-jar do zachowania podpisu BouncyCastle w jednym, wykonywalnym jarie .
AKTUALIZACJA :
Innym sposobem na zrobienie tego (poprawny sposób?) Jest użycie sygnatariusza Jar Maven . Dzięki temu możesz nadal korzystać z cienia Maven bez błędów bezpieczeństwa. JEDNAK musisz mieć certyfikat do podpisywania kodu (Oracle sugeruje wyszukiwanie „Java Code Signing Certificate”). Konfiguracja POM wygląda następująco:
Nie, nie ma sposobu, aby JCE rozpoznała certyfikat z podpisem własnym, więc jeśli chcesz zachować certyfikaty BouncyCastle, musisz albo użyć wtyczki jar-in-jar, albo uzyskać certyfikat JCE.
źródło
Napotkałem ten sam problem, gdzieś po odwołaniu, działało jak poniżej:
źródło
maven-shade-plugin
tagu.Zakładając, że budujesz plik jar za pomocą mrówki, możesz po prostu poinstruować mrówkę, aby pominęła reżim META-INF. To jest uproszczona wersja mojego celu mrówek:
źródło
Ostatnio zacząłem używać IntelliJ w swoich projektach. Jednak niektórzy z moich kolegów nadal używają Eclipse w tych samych projektach. Dzisiaj mam ten sam błąd po uruchomieniu pliku jar utworzonego przez mój IntelliJ. Podczas gdy wszystkie rozwiązania tutaj mówiące o prawie tej samej rzeczy, żadne z nich nie działało dla mnie łatwo (być może dlatego, że nie używam ANT, build maven dał mi inne błędy, które odsyłały mnie do http://cwiki.apache.org/ confluence / display / MAVEN / MojoExecutionException , a także nie mogłem dowiedzieć się, jakie są podpisane słoiki!)
Wreszcie mi to pomogło
Zgadnij, co zostało usunięte z mojego pliku jar ?!
Wygląda na to, że problem dotyczył niektórych plików związanych z zaćmieniem.
źródło
Miałem ten sam problem
gradle
podczas tworzenia grubego słoika, aktualizacjabuild.gradle
pliku za pomocą linii wykluczenia rozwiązała problem.źródło
Jeśli używasz gradle, oto pełne zadanie FarJar:
źródło
Porównaj folder META-INF w nowym słoiku ze starym słojem (zanim dodasz nowe biblioteki). Możliwe, że pojawią się nowe pliki. Jeśli tak, możesz je usunąć. To powinno pomóc. Pozdrawiam, 999michal
źródło
Strategia polegałaby na użyciu ANT w celu uproszczenia usuwania podpisu z każdego pliku Jar. Wykonałby następujące kroki:
Oto makrodef ANT wykonujący pracę:
`
Definicja może być następnie wywołana w ten sposób w zadaniu ANT:
źródło
Co mi pomogło (IntelliJ IDEA 2016.3): Plik -> Struktura projektu -> Artefakty -> Dodaj plik JAR -> Wybierz klasę główną -> Wybierz „skopiuj do katalogu wyjściowego i połącz przez manifest” -> OK -> Zastosuj -> Kompiluj - > Buduj artefakty ... -> Buduj
źródło
Możliwe, że dwóch różnych sygnatariuszy zepsuje umysł Java.
Spróbuj usunąć folder META-INF ze słoika, ponownie dodając manifest i podpisując JAR, pomogło mi to: http://jehy.ru/articles/2013/12/13/invalid-signature-file-digest-for-manifest-main- atrybuty /
źródło
Jeśli szukasz rozwiązania Fat JAR bez rozpakowywania lub manipulowania oryginalnymi bibliotekami, ale ze specjalnym modułem ładującym klasy JAR, spójrz na mój projekt tutaj .
Oświadczenie: Nie napisałem kodu, po prostu spakowałem go i opublikowałem w Maven Central i opisałem w moim read-me, jak go używać.
Osobiście używam go do tworzenia uruchamialnych plików JAR uber zawierających zależności BouncyCastle. Może to też jest przydatne dla ciebie.
źródło
Dla tych, którzy mają problemy z zaakceptowanym rozwiązaniem, istnieje inny sposób na wykluczenie zasobu z zacienionego słoika za pomocą DontIncludeResourceTransformer:
https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#DontIncludeResourceTransformer
Od wersji 3.0 ten transformator akceptuje listę zasobów. Wcześniej wystarczy użyć wielu transformatorów, każdy z jednym zasobem.
źródło
Zdarzyło mi się to w Intellij, kiedy kliknąłem „Dodaj jako projekt Maven” w dolnej linii, kiedy Intellij powiedział „znaleziono niezarządzane pliki pom”. Tymczasem nasz folder został już wygenerowany. Więc nie otrzymałem ostatnich zmian.
Usunięcie folderu i uruchomienie programu rozwiązało problem. nasz folder został następnie ponownie utworzony.
Zobacz także odpowiedź Little Fox. Błąd, który otrzymałem, był bardzo podobny do jego.
źródło
Miałem podobny problem. Powodem było to, że kompilowałem przy użyciu JDK z innym JRE niż domyślny w moim oknie Windows.
Korzystanie z prawidłowego pliku java.exe rozwiązało mój problem.
źródło
Jeśli otrzymujesz to podczas próby powiązania plików JAR dla projektu powiązań Xamarin.Android w następujący sposób:
Wystarczy otworzyć pliki JAR za pomocą Winzip i usunąć katalogi meta-inf. Przebuduj - praca wykonana
źródło