Como executar projeto modular, fora do netbeans?

28 respostas Resolvido
AlexandreCamelo

Amigos…

Já revirei o fórum e não achei essa resposta.

OBS: sou iniciante em Java.

Estou desenvolvendo uma aplicação, através de um PROJETO MODULAR. Estou trabalhando com Netbeans 11.3 / JavaFX / Scene Builder 11.0 / Java 13.

A aplicação funciona, corretamente, dentro da IDE. Porém não consigo executá-la fora da IDE.

Quando tento executar, através do prompt de comando, ocorre seguinte erro: “no main manifest attribute”.

Após pesquisar, entendi que no meu arquivo Manifest.mf não consta a referência à classe principal do projeto, ou seja, a classe que contém o método main.

Tentei editar o arquivo, na munheca (manualmente), mas o netbeans não dá acesso.

Tentei seguir os passos, constantes na documentação do netbeans, no link: https://netbeans.org/kb/articles/javase-deploy.html, mas também não consegui (o que esse tutorial explica, basicamente, é que temos que informar ao netbeans qual é a classe principal, adicionar as bibliotecas externas e depois dar um BUILD, que o netbeans configura o arquivo Manifest.mf).

No meu caso, o netbeans não configura o arquivo. A classe principal está informada e as bibliotecas estão inclusas. Porém, mesmo depois de dar o BUILD, as únicas informações que constam no arquivo, são as que envio, abaixo:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.10.4
Created-By: 13.0.2+8 (Oracle Corporation)

Alguém consegue me ajudar com esse caso?

Agradeço, bastante.

28 Respostas

T

No Netbeans clique no “Clean and Build Project” ou aperte Shift+F11 para limpar e reconstruir o projeto.
Com este procedimento deverá existir na pasta principal do projeto a pasta dist com a aplicação “compilada” e as biblioteca, daí, tente executar o seu projeto pela linha de comando para ver se funciona.
Se gerar algum erro informe, por favor.

AlexandreCamelo

Isso foi a primeira coisa que fiz, @Trapezus.

Já tentei de tudo.

Até já consegui modificar o arquivo MANIFEST.MF, abrindo o arquivo JAR com o winrar. Porém, quando consigo incluir a Main-Class no arquivo MANIFEST, o erro muda: "NÃO FOI POSSÍVEL ENCONTRAR A CLASSE Controles.Inicio (“Controles” é o nome do package, “Inicio” é o nome da classe principal).

Acho que todo o problema está no fato de ser um PROJETO MODULAR. Dessa forma, a IDE não está reconhecendo a classe principal. Creio que o caminho está na alteração do arquivo project.properties. Porém isso ainda não está muito claro para mim, já que sou novo na linguagem.

(é sempre bom lembrar de um detalhe: a aplicação está funcionando, perfeitamente, dentro do netbeans).

Nesse exato momento, estou na página da APACHE, vendo como alterar o arquivo project.properties, pra ver se a coisa funciona.

Se você tiver mais alguma dica, será MUITO bem vinda.

Obrigado!

T

Já experimentou criar um projeto vazio e trazer os arquivos para este novo projeto e refazer a compilação?

AlexandreCamelo

Ainda não.

Vou tentar e te respondo.

AlexandreCamelo

Acabo de tentar, criando um novo projeto.

Mesmo problema.

javaflex

Usa Swing que não terá essas dores de cabeça.

AlexandreCamelo

A aplicação já tá toda construída com JavaFX.

Não tenho mais como voltar atrás.

j-menezes

Isso ai não tem nada a ver com “Swing”, é incrivel como falam coisas sem saber.
O Problema esta na modularização.

Primeiro de tudo entenda que seu projeto modular poderá ser executado como nativo para a plataforma em questão onde atraves do JLink é gerado uma JVM tambem modularizada reduzida a necessidade do seu projeto, então basta chamar o script, pode acontecer que dentro das libs do nativo esteja faltando algumas bibliotecas do JavaFX, então copia elas para lá. (No NetBeans dentro do projeto --> Properties --> Packaging --> create JLINK distribution )

Mas tambem pode ser executado em um JVM (global por assim dizer) desde que você passe os parametros dos modulos na chamada.

j-menezes

Para de viajar na maionese, isso ai não tem nada a ver com Swing e sim com modularização.

AlexandreCamelo

E como é essa parametrização na chamada?

Tem como me dar um exemplo?

j-menezes
Solucao aceita

1.Se for chamar de acordo com a plataforma, basta ir no diretorio
… dist/jlink [O Nome do seu Projeto]/bin // basta chamar seu Projeto

2.Se for uma chamada global por parametro
Quando você dá um Clean and Build no NetBeans ira mostrar uma linha com a chamada incluindo todos os -modulepath dos modulos
Caso queira incluir os module-path dentro de um jar dê uma lida nesse manual
http://tutorials.jenkov.com/java/modules.html

AlexandreCamelo

Colega @j-menezes… Só você para resolver as broncas que encontro!

Pior: a resposta estava, O TEMPO TODO, debaixo do meu nariz!

A linha de chamada é, REALMENTE, entregue, PRONTINHA, no “clean and build”.

Bem… Funcionou pelo prompt do DOS, porém não gostei muito, pois, se eu fechar a janela do prompt, a aplicação também é fechada.

Então vamos à opção do JLINK: quando eu ativo a opção "create JLINK distribution, ele dá o seguinte erro, durante o clean and build:

"Error: automatic module cannot be used with jlink: javafx.swt from file:///C:/Camelo/JAVA/openjfx-11.0.2_windows-x64_bin-sdk/javafx-sdk-11.0.2/lib/javafx-swt.jar"

Além disso, não gera uma pasta “jlink”, com o arquivo dentro.

O que pode ter ocorrido?

j-menezes

Isso tem a ver com as permissoes dentro do module-info e o que você está usando de bibliotecas.

Somente vai gerar essa pasta jlink se tudo estiver certinho mesmo.

Em relação ao prompt chato, veja se criando uma arquivo de bat resolve.

start /B seuscript.bat

AlexandreCamelo

Sobre o prompt, eu já havia feito um BAT. Dá na mesma.

Sobre o JLink…

As únicas bibliotecas que uso são as do JAVAFX e do POSTGRESQL.

Abaixo, segue meu module-info (inclusive, escrevi as instruções do module-info, através de uma postagem sua, aqui no fórum).

Não sei se você consegue verificar, assim, sem ver o restante do sistema, mas aí vai:

module TotalGeral 
{

requires javafx.swt;    
requires javafx.base;
requires javafx.controls;
requires javafx.fxml;
requires javafx.graphics;
requires java.base;
requires java.sql;
requires org.postgresql.jdbc;

    
     
    
    exports Modelos;
    opens Modelos to javafx.base; 
    
    exports Controles;
    opens Controles to javafx.fxml;
    
    exports Telas;
    opens Telas to javafx.fxml;
    
    exports JDBC;
    opens JDBC to javafx.base;
   
}
j-menezes

É porque a chamada esta partindo de dentro do Terminal, se você colocar como um icone devera funcionar como outra aplicacao qualquer.

Em relação as librarys se você não está usando o javafx.swt retira ela, mesmo porque voce precisa da SWT, tem um povo que gosta e usa essa biblioteca, não é meu caso.
SWT é uma biblioteca concorrente do Swing e do JavaFX.

AlexandreCamelo

Me responde uma outra coisa:

A linha “exports Telas”, no arquivo module-info, está sublinhada em vermelho, informando que o pacote ESTÁ VAZIO ou NÃO EXISTE.

Só que o pacote EXISTE e CONTÉM as telas do aplicativo.

Já é a segunda vez que isso ocorre, comigo.

Tem ideia do que esteja ocorrendo? (até já reiniciei o netbeans, mas não adiantou).

Para que JLink funcione, eu preciso exportar TODOS os packages, não é mesmo?

j-menezes

Isso mesmo, tem alguma coisa errada ai com Telas.
Se estiver com o terminal aberto e dentro do diretorio, saia desse diretorio que sera gerado Telas e Chama Clean and Build novamente.

AlexandreCamelo

Não estava com o diretório aberto.

Retirei a biblioteca SWT, mas, agora, o erro aponta para a biblioteca do Postgres.

j-menezes

Que erro tá dando ?

AlexandreCamelo

O mesmo erro de antes, só que citando a biblioteca do postgres, ao invés da swt:

Error: automatic module cannot be used with jlink: org.postgresql.jdbc from file:///C:/Camelo/JAVA/postgresql-42.2.9.jar

Pelo jeito, se eu excluísse a biblioteca do postgres, esse erro citaria a próxima biblioteca da lista: javafx.base , e assim por diante.

Acho que o erro não estava na swt, mas sim nos packages ou no arquivo modules-info.

Criei um novo package TELAS2, joguei todos os fxml dentro dela, mas continua dizendo que o package não existe ou está vazio. Muito estranho.

j-menezes

Calma, estive testando o NetBeans 11.3 aqui e esta’ bugado.
Tente com o NetBeans 11.2, esse tô usando aqui sem erros.

Já o javafx.swt se voce nao esta usando SWT pode retirar de qualquer forma mesmo, em modularizacao nao tem porque colocar um modulo que nao vai usar.

AlexandreCamelo

Ok.

Deixa eu ver.

AlexandreCamelo

No NetBeans 11.2 dá o mesmo erro.

Já excluí a SWT. Como não apareceu nenhum erro depois disso, eu não pretendia voltar a usar.

Tô te enviando um link do projeto zipado (não consegui enviar, por aqui):

Vê se dá o mesmo erro, aí.

Se conseguir fazer o procedimento do JLink por aí, me avisa.

AlexandreCamelo

Consegui resolver a questão do PACKAGE.

Como, no pacote, só existiam arquivos FXML, o netbeans estava considerando vazio.

Criei uma classe .java, vazia, dentro do package e tudo ficou certo.

AlexandreCamelo

Porém ainda não consigo criar o JLink, mesmo com todos os exports do module-info, estando em ordem.

:no_mouth:

j-menezes

Esse problema é que o driver do postgresql não esta modularizado.
O JLink exige o module.
Para resolver isso tem 2 formas
1.usar o jdeps ele vai gerar o module-info.java compila e depois jar update

2.Outra forma que Eu tenho feito com certa frequencia é ter o fonte
e criar o module-info.java e compilar

No momento não vai dar pra mim adaptar o drive do postgresql, mas assim que tiver um tempo dou uma olhada melhor nisso.

Modularização foi feita pensando em portar o Java em pequenos dispositivos, como celulares, raspberry pi entre outros em que voce não precisa de um tiro de elefante pra matar uma formiguinha.

Voce pode se desejar, fazer qualquer teste simples ai usando somente o JavaFX e ver como o JLink funciona, nesse meio tempo se pensa em resolver o driver do postgresql para o JLink.

AlexandreCamelo

Ok, cara.

Obrigado, mais uma vez.

Vou dar uma olhada nesse jdeps e nesse link, que você informou mais cedo (http://tutorials.jenkov.com/java/modules.html) - só vi, agora.

Sei que funcionaria sem as bibliotecas. Dei uma olhada na documentação do JavaFX e lá explica, em detalhes, como criar um projeto modular e como criar a imagem executável. Sei que fiz tudo certo, então era pra estar funcionando. O problema está nas bibliotecas, mesmo.

Depois, se você lembrar, dá uma olhada nessa questão do driver do postgres e me cita em alguma publicação, aqui, no fórum.

De toda forma, você já tirou um peso das minhas costas. Eu já pensava que todo o meu trabalho tinha sido em vão. Agora, já sei que tá tudo certo.

Valeu!

AlexandreCamelo

Depois de passar o dia pesquisando, finalmente achei a maneira de executar pelo prompt do DOS, deixando a janela do DOS oculta.

Vou postar, aqui, para futuras consultas do pessoal.

Ao invés de START ou CMD, a solução foi USAR OS DOIS: nesse caso, o START chamando o CMD. Cada um com seus argumentos:

start /min cmd /c java restante-da-chamada

Dessa forma, a janela do DOS fica minimizada e só o aplicativo Java aparece na tela.

Funcionou, que foi uma belezura.

Abraço.

Criado 18 de março de 2020
Ultima resposta 21 de mar. de 2020
Respostas 28
Participantes 4