Como executar projeto modular, fora do netbeans?

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.

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.

1 curtida

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!

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

Ainda não.

Vou tentar e te respondo.

Acabo de tentar, criando um novo projeto.

Mesmo problema.

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

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

Não tenho mais como voltar atrás.

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.

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

E como é essa parametrização na chamada?

Tem como me dar um exemplo?

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

1 curtida

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?

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

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;
   
}

É 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.

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?

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.

Não estava com o diretório aberto.

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

Que erro tá dando ?