O que é um jar uber?


Respostas:


357

Überé a palavra alemã para aboveor over(na verdade é cognato do inglês over).

Portanto, nesse contexto, um uber-jar é um "over-jar", um nível acima de um JAR simples (a) , definido como aquele que contém seu pacote e todas as suas dependências em um único arquivo JAR. Pode-se pensar que o nome vem do mesmo estábulo que ultrageek, super-homem, hiperespaço e metadados, todos com significados semelhantes "além do normal".

A vantagem é que você pode distribuir seu uber-jar e não se importa se as dependências estão instaladas ou não no destino, pois o uber-jar realmente não tem dependências.

Todas as dependências de suas próprias coisas dentro do uber-jar também estão dentro desse uber-jar. Como são todas as dependências dessas dependências. E assim por diante.


(a) Eu provavelmente não deveria ter que explicar o que é um JAR para um desenvolvedor Java, mas vou incluí-lo por completo. É um arquivo Java, basicamente um único arquivo que normalmente contém vários arquivos de classe Java, juntamente com metadados e recursos associados.


Estranho ... Eu sou alemão e, é claro, conheço a palavra "über" e o significado. Mas por que é usado aqui no contexto do Maven? Nesse caso, significa que uma ou mais coisas são reunidas e são acessíveis através do jar gerado. Unfortunateley essa dica não sovle meu problema maven ;-)
Bjoern

7
BTW, übere oversão o resultado de uma mudança vocal sistemática em Old germânica que também pode ser observada nestes pares de palavras: geben/give, leben/live, haben/have, heben/heavee muitos mais.
biziclop

Descrição muito inteligente: Exemplo de link
Veniamin

Dada a quantidade de sofrimento que tive ao tentar educar as pessoas, decidi simplesmente remover as coisas que alguns reclamam. Eu ainda defino uber no contexto do idioma alemão, mas a lição de história (um tanto detalhada) agora se foi :-)
paxdiablo 20/02

58

jar ubar também é conhecido como jar de gordura, ou seja, jar com dependências.
Existem três métodos comuns para construir um uber jar:

  1. Sem sombra: Descompacte todos os arquivos JAR e, em seguida, reembale-os em um único JAR. Funciona com o carregador de classes padrão do Java. Ferramentas maven-assembly-plugin
  2. Sombreado: O mesmo que não sombreado, mas renomeie (ou seja, "sombra") todos os pacotes de todas as dependências. Funciona com o carregador de classes padrão do Java. Evita alguns conflitos (não todos) na versão de dependência. Ferramentas maven-shade-plugin
  3. JAR de JARs: O arquivo JAR final contém os outros arquivos JAR incorporados. Evita conflitos de versão de dependência. Todos os arquivos de recursos são preservados. Ferramentas: Exportador de Arquivos JAR do Eclipse

para mais


57

A definição de Paxdiablo é realmente boa.

Além disso, considere entregar um uber-jar às vezes bastante interessante, se você realmente deseja distribuir um software e não deseja que o cliente precise baixar dependências sozinho. Como uma desvantagem, se sua própria política não permitir o uso de alguma biblioteca, ou se eles tiverem que vincular alguns componentes extras (slf4j, bibliotecas compatíveis com o sistema, arch specialiez libs, ...), isso provavelmente aumentará as dificuldades para eles .

Você pode fazer isso:

Uma solução mais limpa é fornecer sua biblioteca separadamente; O maven-shade-plugin possui um descritor pré-configurado para isso. Isso não é mais complicado de fazer (com o maven e seu plugin).

Finalmente, uma solução realmente boa é usar um pacote OSGI. Há muitos bons tutoriais sobre isso :)

Para mais configurações, leia os seguintes tópicos:


4

Um arquivo Java executável independente. No caso dos uberjars do WildFly Swarm, é um único arquivo .jar contendo seu aplicativo, as partes do WildFly necessárias para suportá-lo, um repositório interno de dependências do Maven, além de um calço para inicializar tudo. Veja isso


0

Os nomes diferentes são apenas formas de empacotar aplicativos java.

Magro - Contém apenas os bits que você digita literalmente no seu editor de código e mais NADA.

Fino - Contém todas as acima, além das dependências diretas do aplicativo (drivers db, bibliotecas de utilidades, etc.).

Oco - O inverso de Fino - Contém apenas os bits necessários para executar seu aplicativo, mas NÃO contém o próprio aplicativo. Basicamente, um "servidor de aplicativos" pré-empacotado no qual você pode implantá-lo posteriormente, no mesmo estilo dos servidores de aplicativos Java EE tradicionais, mas com diferenças importantes.

Fat / Uber - Contém o bit em que você literalmente se escreve, além das dependências diretas do seu aplicativo, além dos bits necessários para executar o aplicativo "por conta própria".

Fonte: Artigo de Dzone

Representação visual de tipos JAR

Publicado também em: https://stackoverflow.com/a/57592130/9470346

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.