Ungültige oder beschädigte JAR-Datei, die vom Maven-Schatten-Plugin erstellt wurde
Nach dem hinzufügen der Maven jFree Abhängigkeit zu meiner bestehenden Anwendung, ich bin nicht in der Lage zu führen Sie die erstellte jar.
Die einzige Fehlermeldung die ich bekomme ist folgende:
java -jar target/com.company.product-1.0.0-SNAPSHOT.jar
Error: Invalid or corrupt jarfile target/com. company.product-1.0.0-SNAPSHOT.jar
Den kompletten pom.xml
sieht wie folgt aus:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion
<groupId>com.mycompany</groupId>
<artifactId>com.mycompany.test</artifactId>
<name>${project.artifactId}</name>
<version>1.0.0-SNAPSHOT</version>
<properties>
<java-version>1.7</java-version>
<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
<org.springframework.data-version>1.0.3.RELEASE</org.springframework.data-version>
<org.springframework.ws-version>2.0.4.RELEASE</org.springframework.ws-version>
<org.springframework.ws.oxm-version>1.5.10</org.springframework.ws.oxm-version>
<org.aspectj-version>1.6.12</org.aspectj-version>
<org.slf4j-version>1.5.10</org.slf4j-version>
<selenium-java-version>2.25.0</selenium-java-version>
<browser-mob-version>2.0-beta-6</browser-mob-version>
</properties>
<dependencies>
<!-- Hint A: If we delete this dependency it works -->
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.0.14</version>
<exclusions>
<exclusion>
<artifactId>itext</artifactId>
<groupId>com.lowagie</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.3.2</version>
</dependency>
<dependency>
<groupId>de.schlichtherle.io</groupId>
<artifactId>truezip</artifactId>
<version>6.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>apache-log4j-extras</artifactId>
<version>1.1</version>
</dependency>
<!-- Caching with ehcache -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.5.2</version>
<type>pom</type>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>3.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>3.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>3.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
<scope>test</scope>
</dependency>
<!-- Hibernate -->
<dependency>
<groupId>org.hibernate.java-persistence</groupId>
<artifactId>jpa-api</artifactId>
<version>2.0-cr-1</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.5.1-Final</version>
</dependency>
<!-- Database Connectors (HSQL should be removed later) -->
<dependency>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>1.8.0.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.16</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- Spring Data JPA dependencies -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>${org.springframework.data-version}</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-oxm</artifactId>
<version>${org.springframework.ws.oxm-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-xml</artifactId>
<version>${org.springframework.ws-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>${org.springframework.ws-version}</version>
</dependency>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.1</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.0</version>
<scope>test</scope>
</dependency>
<!-- Common Utils -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.2</version>
</dependency>
<!-- Selenium -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>${selenium-java-version}</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-firefox-driver</artifactId>
<version>${selenium-java-version}</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId>
<version>${selenium-java-version}</version>
</dependency>
<!-- CSV Lib for Keyword Checker -->
<dependency>
<groupId>net.sf.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>2.0</version>
</dependency>
<!-- Google Places API -->
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.10.3-beta</version>
<exclusions>
<exclusion>
<artifactId>jackson-core-asl</artifactId>
<groupId>org.codehaus.jackson</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client-appengine</artifactId>
<version>1.10.3-beta</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.9</version>
</dependency>
<!-- Google Geocode -->
<dependency>
<groupId>com.google.code.geocoder-java</groupId>
<artifactId>geocoder-java</artifactId>
<version>0.9</version>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>net.sf.jgrapht</groupId>
<artifactId>jgrapht</artifactId>
<version>0.8.3</version>
</dependency>
<dependency>
<groupId>jgraph</groupId>
<artifactId>jgraph</artifactId>
<version>5.13.0.0</version>
</dependency>
<!-- Apache Http Client -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.2.1</version>
</dependency>
<!-- Amazon web services client -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<artifactId>jackson-core-asl</artifactId>
<groupId>org.codehaus.jackson</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- Docx4j - reading excel files -->
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j</artifactId>
<version>2.8.0</version>
</dependency>
<!-- Browser Mob Proxy -->
<dependency>
<groupId>biz.neustar</groupId>
<artifactId>browsermob-proxy</artifactId>
<version>${browser-mob-version}</version>
<exclusions>
<exclusion>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-api</artifactId>
</exclusion>
<exclusion>
<artifactId>icu4j</artifactId>
<groupId>com.ibm.icu</groupId>
</exclusion>
<exclusion>
<artifactId>jackson-mapper-asl</artifactId>
<groupId>org.codehaus.jackson</groupId>
</exclusion>
<exclusion>
<artifactId>jackson-core-asl</artifactId>
<groupId>org.codehaus.jackson</groupId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Hint B: If we copy this Apache POI dependencies to the top, it works -->
<!-- Apache POI - for reading xlsx files -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.8</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.8</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java-version}</source>
<target>${java-version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<!-- must be SURE to do this with both spring.handlers and spring.schemas.
otherwise you won't be able to use them in the spring config files. -->
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.mycompany.test.Start</mainClass>
</transformer>
</transformers>
<filters>
<filter>
<artifact>bouncycastle:bcprov-jdk15</artifact>
<excludes>
<exclude>META-INF/BCKEY.DSA</exclude>
<exclude>META-INF/BCKEY.SF</exclude>
<exclude>META-INF/MANIFEST.MF</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Ich bekomme keine anderen debug-Informationen, wenn ich führen Sie die jar.
Gibt es eine option zum überprüfen der jardatei? Oder so etwas wie java -verbose
...?
Schritte zum reproduzieren:
- erstellen Sie einen neuen Ordner
- Kopieren Pom.xml von oben in den Ordner.
- Speichern Sie die kleinen " public static void main(...). in src/main/java/com/mycompany/test/Start.java
- ausführen
mvn clean package
- ausführen
java -jar target/com.mycompany.test-1.0.0-SNAPSHOT.jar
Anlage 1:
package com.mycompany.test;
public class Start
{
public static void main(final String[] args)
{
System.out.println("If you are able to get this printed with java -jar you made it. Thanks a lot! :)");
}
}
Edit 1:
Begann ich, Sie zu löschen einige Abhängigkeiten um das problem zu identifizieren. Aber ich habe nicht eine klare Vorstellung, was schief geht.
Nun habe ich herausgefunden (Siehe Hinweis B in der pom.xml), die das verschieben der Apache POI-Abhängigkeiten an die Spitze, wird das problem lösen. Aber ich weiß nicht, wie, warum und was ist das problem.
InformationsquelleAutor der Frage d0x | 2012-10-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auf mein Ende, wenn ich erstellen Sie Ihr Projekt mithilfe der
pom.xml
Sie haben uns gezeigt, mitapache-poi
erklärt, nachdemjfreechart
, dann, wie Sie erwähnt haben, bekomme ich eine beschädigte GLAS. Durch das vertauschen der Reihenfolge dieser beiden Abhängigkeiten in der Tat gibt mir eine korrekte JAR.Habe ich einige Erfahrung mit der
maven-shade-plugin
und wenn ich es benutzt habe hatte ich Probleme mit der erstellten JAR -META-INF
Verzeichnis, also habe ich geprüft, die für Defekten.Habe ich versucht, zu kopieren (mit Total Commander) die
META-INF
Verzeichnis irgendwo auf meinem lokalen Dateisystem und was ich bemerkt habe ist, dass es Fehler beim kopieren der Dateien inMETA-INF/licences/
. Wenn ich versucht habe zu kopieren, diese irgendwo einzeln und es funktionierte, aber ich konnte nicht kopieren Sie die ganze Sache. Mein Fazit war, dass die JAR - /ZIP-Archiv ist beschädigt.Was ich Tat, war ich eingegeben GLAS im Total Commander (Strg+Bild ↓ über der JAR-Datei) und ich umbenannt
thirdpartylicenses.txt
zuthirdpartylicenses.txt.wtf
. Tun diese Total Commander bietet dieses zu retten-und es packt Sie das GLAS (ich habe das Total7zip Total Commander packer-plugin installiert - wenn jemand es versucht und es nicht funktioniert, versuchen Sie es mit dieser installiert ist).Danach. Es funktioniert.
(Ich hab auch schon versucht neu zu Verpacken das ganze ohne Umbenennung nichts mit Cygwin ist
unzip
/zip
Befehle, aber das hat nicht funktioniert, das neue Archiv wurde noch beschädigt. Total Commander oder das plugin, das ich bereits erwähnt habe hat etwas Magisches.)Ich denke, die
maven-shade-plugin
erstellt lediglich eine beschädigte oder ungültige ZIP - /JAR-Archiv. Ich bin mir nicht sicher, warum und vielleicht auch welche, die ich beschrieben habe nicht funktioniert für jemand anderes, aber ich dachte, ich würde erwähnen, dass ich vielleicht helfen könnte.Ich konnte nicht einfach verlassen, allein dies, also habe ich tiefer gegraben und ich denke ich habe die Antwort gefunden.
Den bad GLAS enthält 65608 Einträge.
Die gute GLAS enthält 65450 Einträge.
Raten, was der oberen Grenze des die Anzahl der Einträge einer plain ZIP-Datei? Ja. Der Wiki-Artikel spricht über ein ZIP64-format überwindet diese Einschränkung.
Den gute JAR hat weniger Einträge, da die tatsächliche Abhängigkeiten ändern, da die position der Abhängigkeit Erklärungen in Ihrem
pom.xml
. (Wie beschrieben, von dieser Antwort.)Habe ich gezählt, die Einträge wie dieser.
War ich mit Java 7-das scheint zur Unterstützung der neuen ZIP64-format, so vielleicht, wenn jemand versucht, Sie zu zählen Sie die Einträge in der bad JAR mit Java 5 oder 6 wird eine Fehlermeldung angezeigt (ich bin mir nicht sicher aber).
Ich habe auch versucht, führen Sie die JAR - explodierte. Ich habe es entpackt ist das ganze JAR in ein Verzeichnis und führen Sie die ganze Sache wie diese.
Arbeitete wie ein Charme.
Unteren Zeile. Nicht übernutzung die
maven-shade-plugin
.Habe ich ein Projekt bei der Arbeit, wo ich bauen, mein Projekt wie dieses.
maven-dependency-plugin
. Die Kassecopy-dependencies
Ziel. Dieser kopiert Ihre Abhängigkeiten intarget/dependency
wenn ich mich richtig erinnere.Mithilfe der
maven-jar-plugin
ich hinzufügen, diese Abhängigkeiten zu meinem letzten GLAS istMANIFEST.MF
alsClass-Path
Einträge über diese Optionen in die plugins-Konfiguration.So, ich werde
Class-Path
Einträge wiedependency/<artifactId>-<version>.jar
usw.maven-assembly-plugin
Verteiler erstellen ZIP enthält meine Letzte GLAS und die ganzedependency/
Ordner.java -jar final.jar
.In Erster Linie habe ich entschieden sich für diese Lösung, weil in meinem Projekt verwende ich einige Hüpfburg Gläser die Gläser haben einige extravagante dies und das in Ihren
META-INF
- Verzeichnis. Wenn ichmaven-shade-plugin
um meine final runnable JAR brach die Hölle Los und ich bekam scheußliche , dass die Methode nicht gefunden werden konnte und diese Signatur ist nicht ganz richtig Fehler.Sollten Sie sowas auch. Das Maven-shade Unternehmen zu schattigen, um nützlich zu sein (pun intended).
Hier ein blog-post auf den gesamten Prozess, den ich versucht habe zu beschreiben nur oben (Dank
baba), vielleicht ist es ' ll helfen, jemand in der Zukunft.
InformationsquelleAutor der Antwort Kohányi Róbert
Lief ich
mvn dependency:tree
mit Ihrem setup und es wird einen Unterschied beim verschieben derorg.apache.poi
höher hinauf in die Abhängigkeit Erklärungen.Aus der Einführung in das Dependency-Mechanismus in Bezug auf die Abhängigkeit um:
Scheint es einen Konflikt in Ihrer Abhängigkeit von Auflösung und, wodurch Sie Ihre korrupten jar-Datei (weiß nicht, warum es beschädigt wird).
Anyway, hier sind die Unterschiede zwischen den beiden poms (Links ist der Ursprung, die Rechte ist mit
org.apache.poi
höher):(Ist es vielleicht schwer zu sehen auf den Bildern, aber wenn Sie die Ansicht vergrößern, sehen Sie.)
Der große Unterschied ist, dass in der nicht-Arbeit die pom
org.apache.httpcomponents:httpcore:jar:4.2.1
eine Abhängigkeit voncommons-codec:commons-codec:jar:1.6
, und in den arbeiten, pom, diese Abhängigkeit wurde überschrieben mitcommons-codec:commons-codec:jar:1.5
.Denke ich, dass es ein problem mit der
1.6
version voncommons-codec
zusammen mitorg.apache.poi:poi:jar:3.8
die Bedürfnisse der1.5
version.Bearbeiten
Nach diese hervorragende Antwort das erklärt, warum die jar-Datei beschädigt ist (zu viele Einträge in der Dose ist) ich möchte nur hinzufügen eine einfache Lösung, zumindest funktioniert für Ihr spezielles problem.
Fügen Sie den tag
<minimizeJar>true</minimizeJar>
zu Ihremmaven-shade-plugin
Konfiguration.Nach, dass Ihre
java -jar target/com.mycompany.test-1.0.0-SNAPSHOT.jar
auf der Kommandozeile arbeiten.InformationsquelleAutor der Antwort maba
Frage ich mich, wenn Sie haben mehr als eine version der jfree jar in Ihrem Projekt und Schatten-plugin nimmt den falschen. Haben Sie überprüft, die uber-jar für das jfree-Klassen und im Vergleich mit den in der jfree Glas, das Sie erwarten, zu sein? Öffnen Sie die jar mit winzip oder gleichwertig.
InformationsquelleAutor der Antwort DaveRlz