Até agora, criei arquivos JAR executáveis por meio da funcionalidade "Exportar ..." do Eclipse, mas agora mudei para o IntelliJ IDEA e Gradle para automação de compilação.
Alguns artigos aqui sugerem o plug-in "aplicativo", mas isso não leva totalmente ao resultado que eu esperava (apenas um JAR, nenhum script de inicialização ou algo assim).
Como posso obter o mesmo resultado que o Eclipse obtém com o diálogo "Exportar ..."?
As respostas de JB Nizet e Jorge_B estão corretas.
Na sua forma mais simples, criar um JAR executável com Gradle é apenas uma questão de adicionar as entradas apropriadas ao manifesto . No entanto, é muito mais comum ter dependências que precisam ser incluídas no caminho de classe, tornando essa abordagem complicada na prática.
O plugin do aplicativo fornece uma abordagem alternativa; em vez de criar um JAR executável, ele fornece:
run
tarefa para facilitar a execução fácil do aplicativo diretamente da construçãoinstallDist
tarefa que gera uma estrutura de diretórios incluindo o JAR construído, todos os JARs dos quais depende e um script de inicialização que reúne tudo isso em um programa que você pode executardistZip
edistTar
tarefas que criam arquivos que contêm uma distribuição completa de aplicativos (scripts de inicialização e JARs)Uma terceira abordagem é criar o chamado "fat JAR", que é um JAR executável que inclui não apenas o código do seu componente, mas também todas as suas dependências. Existem alguns plugins diferentes que usam essa abordagem. Incluí links para alguns que eu conheço; Tenho certeza que existem mais.
fonte
configurations.runtime
para agrupar dependências de tempo de execução no jar único..tar
/.zip
gerados?Como outros observaram, para que um arquivo jar seja executável, o ponto de entrada do aplicativo deve ser definido no
Main-Class
atributo do arquivo de manifesto. Se os arquivos de classe de dependência não forem colocados, eles deverão ser configurados naClass-Path
entrada do arquivo de manifesto.Eu tentei todos os tipos de combinações de plugins e para a simples tarefa de criar um jar executável e de alguma forma incluir as dependências. Todos os plugins parecem estar faltando de um jeito ou de outro, mas finalmente consegui o que queria. Nenhum script misterioso, nem um milhão de mini-arquivos diferentes poluindo o diretório de compilação, um arquivo de script de compilação bastante limpo e, acima de tudo: nem um milhão de arquivos de classe de terceiros estrangeiros mesclados no meu arquivo jar.
A seguir, é copiada e colada a partir daqui para sua conveniência.
[Como fazer] crie um arquivo zip de distribuição com jars de dependência no subdiretório
/lib
e adicione todas as dependências àClass-Path
entrada no arquivo de manifesto:Hospedado como uma essência aqui .
O resultado pode ser encontrado em
build/distributions
e o conteúdo descompactado tem a seguinte aparência:Conteúdo de
MyJarFile.jar#META-INF/MANIFEST.mf
:fonte
lib
diretório do arquivo zip / tar produzido, mas nolib
diretório-pai, como sugere esta resposta. Essa solução parecia funcionar perfeitamente para mim."lib/$it.name"
para"$it.name"
fará o trabalho.A menor solução para mim foi usar o plugin gradle-shadow-plugin
Além de aplicar o plugin, tudo o que precisa ser feito é:
Configure a tarefa jar para colocar sua classe Main em manifesto
Execute a tarefa gradle
Pegue o app-version-all.jar em build / libs /
E, finalmente, execute-o via:
fonte
build.gradle
.'com.my.app.MainKt'
. Sem mais informações, não posso ajudá-lo mais.Você já tentou a tarefa 'installApp'? Ele não cria um diretório completo com um conjunto de scripts de início?
http://www.gradle.org/docs/current/userguide/application_plugin.html
fonte
installApp
não cria umMETA-INF/MANIFEST.MF
arquivo. Estou fazendo algo errado?installApp
tarefa na lista de tarefas do Plug-in de Aplicativo . Você quis dizer eminstallDist
vez disso?installApp
foi renomeado parainstallDist
no Gradle 3.0. Aqui está a nota de lançamento .Obrigado Konstantin, funcionou como um encanto com poucas nuances. Por alguma razão, especificar a classe principal como parte do manifest do jar não funcionou muito e, em vez disso, ele queria o atributo mainClassName. Aqui está um trecho de build.gradle que inclui tudo para fazê-lo funcionar:
Depois de executar o gradle shadowJar, você obtém myapp- {version} -all.jar na pasta de construção que pode ser executada como java -jar myapp- {version} -all.jar.
fonte
Você pode definir um artefato jar nas configurações do módulo (ou estrutura do projeto).
Fazer um jarro é tão fácil quanto clicar em "Criar artefato ..." no menu Build. Como bônus, você pode empacotar todas as dependências em um único jar.
Testado no IntelliJ IDEA 14 Ultimate.
fonte
Eu verifiquei alguns links para a solução, finalmente fiz as etapas abaixo mencionadas para fazê-la funcionar. Estou usando o Gradle 2.9.
Faça as seguintes alterações em seu arquivo build, gradle:
Mencione o plug-in:
Forneça o Buildscript:
Forneça a classe principal:
Crie o fatjar:
Execute o fatjar em / build / libs /:
fonte
Você pode usar o plugin SpringBoot:
Crie o jar
E então execute
Nota: seu projeto NÃO precisa ser um projeto SpringBoot para usar este plugin.
fonte