Manifest.mf errato in IntelliJ IDEA ha creato .jar


102

Sto cercando di impacchettare un progetto utilizzando le librerie OptaPlanner 6.0.1 in un .jar tramite l'artefatto jar di IntelliJ IDEA ma invece del mio manifest.mf contenente lo standard

Manifest-Version: 1.0
Main-Class: a.b.c.app

il jar utilizza quello fornito in ecj-3.7.2.jar, una delle librerie di supporto di OptaPlanner:

Manifest-Version: 1.0
Build-Jdk: 1.6.0_26
Built-By: ibrandt
Created-By: Apache Maven
Archiver-Version: Plexus Archiver

Per questo "no main manifest attribute, in appname.jar"motivo, si verifica un errore quando si tenta di eseguire l'app. Se sostituisco manualmente il manifest nel file .jar con il mio, tutto funziona correttamente. C'è qualcosa che posso fare per risolvere questo problema?

Tengo le librerie in una directory / lib separata e sono state aggiunte alla radice di jar artifact come Directory estratta, IntelliJ IDEA è v13.0.1.


1
Conosci strumenti di costruzione come ant, maven o gradle?
MariuszS

Li conosco, ma finora ho usato solo make e .NET controparti (NAnt, MSBuild). Quale di loro dovrei scegliere se lo strumento di costruzione di IntelliJ non lo taglia?
Grudolf

1
Vota per correggere questo problema qui ,
bigjosh

Risposte:


260

Ho avuto lo stesso problema.

Assicurati che il tuo MANIFEST.MF sia in:

src/main/resources/META_INF/

NON

src/main/java/META_INF/

20
Questa è davvero la risposta corretta, sembra che Intellij IDEA stia smarrendo la cartella META-INF quando il modello di progetto è Maven
Kumait

Nel mio caso ho dovuto modificare il layout del mio progetto. In precedenza avevo un progetto con layout Maven ma ho rimosso il supporto di Maven. Ricrea un progetto da zero e ora funziona.
Maxence

1
Questo non funzionava per me, ho dovuto spostare il file Mainfest nella radice del progetto.
gare il

Maven è così stupido da inserire questo file nella directory sbagliata? : ^)
Daria

@Kumait, il problema è ancora presente in IntelliJ 2017.1.5. Mi chiedo se il team di JetBrain ne sia consapevole.
fruqi

12

Aggiustare:

  1. File> Struttura del progetto
  2. In Impostazioni progetto a sinistra, seleziona "Artefatti"
  3. Trova la definizione JAR nel riquadro centrale e selezionala
  4. Nel riquadro sinistro della scheda "Layout di output" trova il file jar nell'elenco e selezionalo
  5. In basso, fai clic sul pulsante "Usa manifest esistente" e seleziona il file manifest che si trova nell'origine del progetto.
  6. Fare clic su OK ed eseguire la build

3
Non c'è il pulsante "Usa manifest esistente", tuttavia il file manifest nel layout di output punta alla posizione corretta (... \ src \ main \ java \ META-INF \ MANIFEST.MF)
grudolf

5
OK, ho dovuto eliminare l'artefatto jar e ricrearlo, questa volta come "Vuoto" invece di "Da moduli con dipendenze". Ottenuto i pulsanti "Crea manifest" e "Usa manifest esistente", ha puntato alle mie librerie manifest e readded e compilato output. Ci sono due differenze rispetto a prima: META_INF \ MANIFEST.INF è ora esplicitamente incluso nel layout di output e il file jar sembra essere generato correttamente. :)
grudolf

Questo non risolve il problema, almeno per me. La risposta di jamahn ha funzionato comunque.
Andrew Breksa

Commento aggiunto dall'utente a bassa reputazione @ ds-justice come segue: il commento di @grudolf sopra sulla creazione di un barattolo vuoto è stata l'unica cosa che ha funzionato per me dopo diverse ore di lotta con un progetto Gradle importato. Questa è una domanda importante, ti preghiamo di considerare di ripubblicare il tuo commento come risposta separata.
Shawn Mehan

10

Come notato nel commento di @grudolf in una delle altre risposte, un modo per farlo (e l'unico che ha funzionato per me in un progetto Gradle importato) è creare un vaso vuoto come segue:

  • Struttura del progetto -> Artefatti -> + Jar -> Vuoto
  • Il riquadro centrale ora ha i pulsanti Crea manifest e Usa manifest esistente. Usa uno di questi.
  • Ho avuto difficoltà se ho estratto le librerie dipendenti con i propri manifest nella radice di output, sembravano sovrascrivere in modo intermittente il nuovo manifest creato manualmente. Pasticciare con l'ordine delle operazioni sembrava farlo funzionare.

AGGIORNARE:

Questo è sicuramente un bug in Idea. Questa risposta collegata funziona in modo affidabile quando sono presenti directory estratte. In sostanza, si trova il vostro .idea / JARNAME.xml, aggiungere aggiungere il seguente elemento alla cima del <root>elemento per il vostro vaso. Tutti gli elementi estratti sopra la nuova copia del file che contengono un manifest bloccheranno il tuo nuovo manifest.

  <element id="directory" name="/META-INF">
    <element id="file-copy" path="$PROJECT_DIR$/modulename/src/META-INF/MANIFEST.MF" />
  </element>

7

Se vuoi specificare la classe principale, devi aggiungere questo plugin a pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>Form</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

1

Ho avuto un problema simile.

Il problema era nel file pom.xml.

<archive>
  <manifestEntries>
    <Dependencies>one.jar,
                  two.rar, 
                  other.jar
    </Dependencies>
  </manifestEntries>
</archive>

Non so per quale motivo questo codice funzioni in eclipse, ma non in IntelliJ

Questo è corretto.

<archive>
  <manifestEntries>
    <Dependencies>one.jar, two.rar, other.jar</Dependencies>
  </manifestEntries>
</archive>

Manifest.mf ha funzionato !!!

Spero che aiuti.


Ho avuto questa situazione esatta e sono giunto alla stessa conclusione che hai fatto tu: le nuove righe tra gli elementi <Dipendenze> funzionavano in Eclipse, ma non in Intellij IDEA.
Arion Krause

0

Esistono diversi modi per generare file jar eseguibili. L'utilizzo della funzionalità GUI di IntelliJ è un buon modo. Un altro modo è usare Maven (o in modo simile in gradle, buildr, ecc.) Che è adatto ai server di compilazione:

È più o meno copia e incollabile dagli esempi di optaplanner maven build:

  1. Il jar dell'utente finale (optaplanner-examples - *. Jar) deve includere il classpath delle sue dipendenze nel suo manifest .
  2. Lo script sh e bat deve quindi eseguire quel jar di conseguenza.

0

Per non avere problemi come Manifest, dovresti avere una directory chiamata "META-INF" nella directory "src". Quindi, crealo e inserisci un file denominato "MANIFEST.MF" con il seguente contenuto:

Manifest-Version: 1.0
Main-Class: <packageName>.Main

Per non dimenticare di sostituire il nome del pacchetto contenente la classe principale sopra!


4
Il record mostra che ho tagliato materiale religioso dal tuo post in agosto. Tieni presente che la comunità ha discusso l'aggiunta di temi religiosi nei post e la risposta è che preferiremmo che fossero lasciati fuori. Tuttavia, sei il benvenuto ad aggiungerli al tuo profilo o avatar.
halfer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.