NetBeans, Maven e “Failed to load Main-Class manifest attribute from”

SCENARIO

NetBeans con il plugin per Maven (Mevenide), si crea un nuovo progetto, si imposa nelle Properties -> Run -> Main Class del progetto il nome della classe che contiente il metodo main, si fa un Run e tutto funziona. A questo punto, si prende il file .jar generato (nella directory target del progetto) e si prova a farlo partire esternamente a NetBeans con il comando:
java -jar xxxxx.jar

ma si ottiene questo errore:
Failed to load Main-Class manifest attribute from xxxxx.jar

Il problema e’ identificabile nel fatto che ogni jar (e’ un archivio compresso, quindi basta scompattarlo) ha al suo interno un file META-INF/MANIFEST.MF che deve contenere un valore, Main-Class, con il nome della classe con il metodo main del proprio programma. Ci si aspetterebbe che una volta impostato questo valore nelle proprieta’ del progetto, questo venga riportato automaticamente anche nel file MANIFEST.MF, ma purtroppo cosi’ non e’ ed occorre fare tutto a mano. Neanche nelle Best Practices for Apache Maven in NetBeans 6.x sembra ci sia scritto nulla sull’argomento.

 

LA CONFIGURAZIONE MANUALE

Il file pom.xml e’ tipico di tutti i progetti Maven e contiente alcune configurazioni del progetto, come ad esempio i progetti da includere in quello corrente ed altre cose. Per modificare il MANIFEST.MF bisogna andare ad agire proprio su questo file.

Si tratta di includere alcuni paramentri che verranno passati al plugin maven-jar-plugin, chiamato in fase di compilazione del progetto, che a sua volta usera’ questi paramentri con il Maven Archiver, responsabile della generazione del MANIFEST.MF da includere nel .jar finale. Ci si puo’ iniziare a fare una cultura sull’argomento partendo dal Manifest customization.

Ecco cosa ho aggiunto nel pom.xml del progetto

  <build>
        ….

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                  <archive>
                      <manifest>
                          <mainClass>com.funambol.avatargrabber.App</mainClass>
                      </manifest>
                  </archive>
                </configuration>
            </plugin>
        ….
        </plugins>
  </build>

L’elemento focale e’ la voce mainClass, impostata nell’esempio a com.funambol.avatargrabber.App.

Ora, ricompilando il progetto, si potra’ notare come il MANIFEST.MF conterra’ la voce Main-Class e l’esecuzione del .jar mediante il comando descritto all’inizio dell’articolo avra’ esito positivo. Una lista degli altri valori che si possono specificare e’ reperibile nella Maven Archiver reference.

 

ALTRE CONFIGURAZIONI INTERESSANTI

Si puo’ utilizzare un proprio MANIFEST.MF che verra’ fuso a quello generato automaticamente in fase di compilazione del progetto grazie alla direttiva <manifestFile>.

 

1 Comments

  1. Hi,

    Thanks for your tips. However I have just a question: next time would you please write blog in English? I don’t know Italian so I used Google translate. I’m sorry if my words sound not polite.

    Regards,

Leave a Reply