it-swarm-pt.tech

A maneira mais fácil de mesclar um release em um arquivo JAR

Existe uma ferramenta ou script que facilmente mescla um monte de arquivos JAR em um arquivo JAR? Um bônus seria definir facilmente o manifesto do arquivo principal e torná-lo executável.

O caso concreto é uma ferramenta de texto Java reestruturado . Eu gostaria de executá-lo com algo como:

Java -jar rst.jar

Tanto quanto eu posso dizer, não tem dependências que indicam que não deve ser uma ferramenta fácil de arquivo único, mas o arquivo Zip baixado contém muitas bibliotecas.

      0  11-30-07 10:01   jrst-0.8.1/
    922  11-30-07 09:53   jrst-0.8.1/jrst.bat
    898  11-30-07 09:53   jrst-0.8.1/jrst.sh
   2675  11-30-07 09:42   jrst-0.8.1/readmeEN.txt
 108821  11-30-07 09:59   jrst-0.8.1/jrst-0.8.1.jar
   2675  11-30-07 09:42   jrst-0.8.1/readme.txt
      0  11-30-07 10:01   jrst-0.8.1/lib/
  81508  11-30-07 09:49   jrst-0.8.1/lib/batik-util-1.6-1.jar
2450757  11-30-07 09:49   jrst-0.8.1/lib/icu4j-2.6.1.jar
 559366  11-30-07 09:49   jrst-0.8.1/lib/commons-collections-3.1.jar
  83613  11-30-07 09:49   jrst-0.8.1/lib/commons-io-1.3.1.jar
 207723  11-30-07 09:49   jrst-0.8.1/lib/commons-lang-2.1.jar
  52915  11-30-07 09:49   jrst-0.8.1/lib/commons-logging-1.1.jar
 260172  11-30-07 09:49   jrst-0.8.1/lib/commons-primitives-1.0.jar
 313898  11-30-07 09:49   jrst-0.8.1/lib/dom4j-1.6.1.jar
1994150  11-30-07 09:49   jrst-0.8.1/lib/fop-0.93-jdk15.jar
  55147  11-30-07 09:49   jrst-0.8.1/lib/activation-1.0.2.jar
 355030  11-30-07 09:49   jrst-0.8.1/lib/mail-1.3.3.jar
  77977  11-30-07 09:49   jrst-0.8.1/lib/servlet-api-2.3.jar
 226915  11-30-07 09:49   jrst-0.8.1/lib/jaxen-1.1.1.jar
 153253  11-30-07 09:49   jrst-0.8.1/lib/jdom-1.0.jar
  50789  11-30-07 09:49   jrst-0.8.1/lib/jewelcli-0.41.jar
 324952  11-30-07 09:49   jrst-0.8.1/lib/looks-1.2.2.jar
 121070  11-30-07 09:49   jrst-0.8.1/lib/junit-3.8.1.jar
 358085  11-30-07 09:49   jrst-0.8.1/lib/log4j-1.2.12.jar
  72150  11-30-07 09:49   jrst-0.8.1/lib/logkit-1.0.1.jar
 342897  11-30-07 09:49   jrst-0.8.1/lib/lutinwidget-0.9.jar
2160934  11-30-07 09:49   jrst-0.8.1/lib/docbook-xsl-nwalsh-1.71.1.jar
 301249  11-30-07 09:49   jrst-0.8.1/lib/xmlgraphics-commons-1.1.jar
  68610  11-30-07 09:49   jrst-0.8.1/lib/sdoc-0.5.0-beta.jar
3149655  11-30-07 09:49   jrst-0.8.1/lib/xalan-2.6.0.jar
1010675  11-30-07 09:49   jrst-0.8.1/lib/xercesImpl-2.6.2.jar
 194205  11-30-07 09:49   jrst-0.8.1/lib/xml-apis-1.3.02.jar
  78440  11-30-07 09:49   jrst-0.8.1/lib/xmlParserAPIs-2.0.2.jar
  86249  11-30-07 09:49   jrst-0.8.1/lib/xmlunit-1.1.jar
 108874  11-30-07 09:49   jrst-0.8.1/lib/xom-1.0.jar
  63966  11-30-07 09:49   jrst-0.8.1/lib/avalon-framework-4.1.3.jar
 138228  11-30-07 09:49   jrst-0.8.1/lib/batik-gui-util-1.6-1.jar
 216394  11-30-07 09:49   jrst-0.8.1/lib/l2fprod-common-0.1.jar
 121689  11-30-07 09:49   jrst-0.8.1/lib/lutinutil-0.26.jar
  76687  11-30-07 09:49   jrst-0.8.1/lib/batik-ext-1.6-1.jar
 124724  11-30-07 09:49   jrst-0.8.1/lib/xmlParserAPIs-2.6.2.jar

Como você pode ver, é um pouco desejável não precisar fazer isso manualmente.

Até agora, eu só tentei o AutoJar e o ProGuard, ambos muito fáceis de serem executados. Parece que há algum problema com o conjunto constante nos arquivos JAR.

Aparentemente jrst está um pouco quebrado, então eu vou tentar consertá-lo. O arquivo Mavenpom.xml foi aparentemente quebrado também, então eu vou ter que consertar isso antes de consertar jrst ... Eu me sinto como um bug-ímã :-)


Update: Eu nunca cheguei a consertar este aplicativo, mas eu verifiquei "assistente de exportação JAR Runnable" do Eclipse que é baseado em um JAR de gordura. Eu achei isso muito fácil de usar para implantar meu próprio código.

Algumas das outras excelentes sugestões podem ser melhores para construções em um ambiente não-Eclipse, oss provavelmente devem fazer uma construção Nice usando Ant . (Maven, até agora me deu dor, mas outros amam isso.)

70
tovare

Assistente de exportação JAR Runnable do Eclipse 3.4 JDT.

No Eclipse 3.5, isso foi estendido. Agora você pode escolher como deseja tratar seus arquivos JAR referenciados.

33
Stephen Denne

O zipfileset de Ant faz o trabalho

<jar id="files" jarfile="all.jar">
    <zipfileset src="first.jar" includes="**/*.Java **/*.class"/>
    <zipfileset src="second.jar" includes="**/*.Java **/*.class"/>
</jar>
62
akuhn

Tendo tentado algumas soluções diferentes, encontrei o One-JAR o mais fácil de trabalhar, e consegui fazer exatamente isso: produzir um único JAR executável que contém tudo o que preciso.

O One-JAR usa um carregador de classes personalizado que pode navegar por recursos aninhados. Olhe para o arquivo .bat no download, parece que org.codelutin.jrst.JRST no jrst-0.8.1.jar é a classe principal, então seu manifesto deve ficar assim:

Main-Class: com.simontuffs.onejar.Boot
One-Jar-Main-Class: org.codelutin.jrst.JRST

O mais legal é que o One-JAR lidará com a transmissão de argumentos de linha de comando para você. O caminho de classe é manipulado pelo carregador de classes customizado, supondo que todos os recursos necessários sejam empacotados no único JAR.

A maneira mais fácil de usar o One-JAR é com formiga; existe uma tarefa ant "jar" de um frasco que funciona da seguinte maneira (assumindo que seu manifesto é chamado de "rst.mf"):

<target name="jar-rst">
    <one-jar destfile="rst.jar" manifest="rst.mf">
        <main jar="jrst-0.8.1.jar" />
        <lib>
            <fileset dir="${pathToJars}">
                <include name="batik-util-1.6-1.jar" />
                <include name="icu4j-2.6.1.jar" />
                <include name="commons-collections-3.1.jar" />
                <!-- Snip -->
            </fileset>
        </lib>
    </one-jar>
</target>
27
Ashley Mercer

Se você é um Maven user, normalmente o plugin Assembly faz o que você quer, ou potencialmente o plugin de sombra, e em alguns casos uma combinação.

Com o plugin Assembly, você coloca um arquivo de manifesto em seu projeto com as configurações necessárias, embora os padrões sejam geralmente muito bons. O edifício é então feito com

mvn Assembly:assembly

Ou se você tiver mais coisas especiais para lidar, um dos outros objetivos. Todos os arquivos JAR a incluir, são selecionados pelo resolvedor de dependências do Maven. Se você usa o plugin de sombra, isso geralmente faz parte do objetivo de instalação, e em um projeto específico que estou fazendo agora eu faço

mvn install
mvn Assembly:single

A meta Assembly:single é trabalhar em torno de problemas de vida útil, neste caso em um aplicativo Spring .

14
larsivi

Você pode usar JarJar que usará o sombreamento de pacotes para garantir que seu arquivo JAR não entre em conflito com outros.

8
Steve g

Existe ProGuard que não apenas compacta seus arquivos JAR em um, mas também pode otimizar, limpar ou ofuscar seus arquivos de classe, tornando o arquivo JAR resultante muito menor do que a soma de todos os arquivos JAR anteriores.

Eu realmente tentei o ProGuard com a ferramenta JRST, e é como você relatou. Eu tentei rastrear o problema e descobri que ele está relacionado a um bug na biblioteca ICU4J referenciada por jrst. O problema é que a versão usada ICU está muito desatualizada agora. Então substituí o arquivo icu.jar pela versão 3.2 do ICU4J. Agora o ProGuard encontra um monte de outros erros/avisos sobre incoistências com as bibliotecas do JRST.

Meu palpite é que o ProGuard funciona como esperado, mas as bibliotecas do jrst simplesmente não são consistentes. Não sei se você pode fazer muito mais do que conversar com seus desenvolvedores, pois eles devem verificar e atualizar as dependências do projeto.

8
jrudolph

(baseado no de Andrian):

<jar id="files" jarfile="all.jar">
  <zipgroupfileset dir="${library.dir}" includes="*.jar" excludes="test-helper.jar"/>
  <zipfileset src="first.jar" includes="**/*.Java **/*.class"/>
  <zipfileset src="second.jar" includes="**/*.Java **/*.class"/>
  <fileset dir=".">
    <include name="LICENSE"/>
    <include name="NOTICE"/>
  </fileset>
</jar>
7
象嘉道

O One-JAR 0.97 acaba de ser lançado em http://one-jar.sourceforge.net , e foi estendido com suporte para frameworks como Spring e Guice , o que pode apresentar problemas para outras abordagens. Ele também lida com inversão de carregador de classe - em que alguns arquivos JAR são externos ao One-JAR (por exemplo, JDBC drivers que podem não ser enviados agrupados).

Um JAR é linha de comando, com plug-ins Ant e Maven 2. Também é simples de construir usando apenas a ferramenta "jar".

Também posso recomendar o Eclipse Jar Exporter (Runnable) no qual Ference Hechler escreveu: ele fez um ótimo trabalho ao criar uma abordagem simples para agrupar um conjunto de arquivos JAR. Ele e eu trabalhamos no One-JAR, mas o Jar Exporter é baseado em uma base de código diferente.

5
simontuffs

Ou usando o plugin Maven Assembly (mvn Assembly: assembly)

3
Philip Helger

Existe uma ferramenta chamada autojar que irá varrer o bytecode e compilar um arquivo .jar com as classes que encontrar, incluindo as classes referenciadas (importadas).

Nem sempre funciona com algo como o Spring, no entanto, onde você especifica os nomes das classes na configuração e é carregado pela estrutura.

3
user7094

Eu acho que a ferramenta que você precisa aqui é JarSplice: http://ninjacave.com/jarsplice

Não não requer Ant ou Maven, tem sua própria GUI, é simples de usar e fazer exatamente o que você pediu -> Mescla o conteúdo de vários arquivos jar em um único (por favor, note que ainda precisa adicionar seu próprio classloader).

2
Nadir

Você deve usar o plugin maven shading para fazer isso. Costumo usar o maven para criar um arquivo jar independente e é tão poderoso

Ver mais:

http://maven.Apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html

0
hoang