Mariusz Prowaźnik

o programowaniu w Javie, Scali i Clojure.


Jak stworzyć archiwum jar wykonywalne z linii poleceń

Podczas zwykłego budowania projektu za pomocą polecenia mavena package w katalogu target powstaje archiwum jar, jednak nie można uruchomić go z linii poleceń, ponieważ nie ma określonej w pliku MANIFEST.MF klasy głównej oraz nie ma załączonych bibliotek zależnych. Próba uruchomienia skutkuje komunikatem:
Failed to load Main-Class manifest attribute from
something.jar

Istnieje bardzo proste rozwiązanie tego problemu - użycie wtyczek Mavena: maven-jar-plugin, maven-shade-plugin. Wystarczy do pliku pom.xml dodać taki kod:
<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-jar-plugin</artifactId>
 <configuration>
  <archive>
   <manifest>
    <mainClass>mpbj.Main</mainClass>
   </manifest>
  </archive>
 </configuration>
</plugin>

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-shade-plugin</artifactId>
 <version>1.2</version>
 <executions>
  <execution>
   <phase>package</phase>
   <goals>
    <goal>shade</goal>
   </goals>
   <configuration>
    <artifactSet>
     <includes>
      <include>commons-collections:commons-collections</include>
      <include>commons-io:commons-io</include>
      <include>commons-cli:commons-cli</include>
     </includes>
    </artifactSet>
    <transformers>
     <transformer implementation="org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformer" />
    </transformers>
   </configuration>
  </execution>
 </executions>
</plugin>
Przy czym należy podać odpowiednią nazwę klasy głównej, oraz w sekcji includes wstawić używane biblioteki zewnętrzne.