Como gerar o arquivo final para o usuario do sistema?

Cordiais saudações, pessoal do GUJ.

Estou com meu sisteminha educativo praticamente pronto e eu queria orientações de vocês que são programadores com mais experiência que eu sobre como devo lidar com a questão da instalação do sistema. Estive conversando com o Chat GPT e aceitei a sugestão de utilizar um arquivo JAR para rodar o sistema, pois parece ser o mais simples de fazer.

Já gerei o JAR mas ele esta dando uma mensagem de erro quando executo a partir do prompt do sistema, antiguíssima tela de DOS ou terminal e quando dou dois cliques sobre o arquivo JAR na pasta ele não faz nada.

A mensagem que a tela de prompt da ao executar o comando java -jar EmpresaVI-1.0-SNAPSHOT.jar é a seguinte: nenhum atributo de manifesto principal em EmpresaVI-1.0-SNAPSHOT.jar e só isso.

O que eu faço, como procedo? Eu gostaria de ter um arquivo para dar cliques nele e iniciar o sistema sem precisar do IDE, pois até o momento eu só tenho usado o sistema através do NetBeans 12.6, o que não é adequado se eu quiser simular o funcionamento comercial do sistema.

Agradeço antecipamente e vamos iniciar o diálogo, de forma que devagar agente chega a um arquivo que rode o programa sem o IDE. Só gostaria de lembrar que se trata de um sistema stand alone sem uso da internet que foi desenvolvido como projeto maven.

Atenciosamente,
Ronaldo

1 curtida

No seu arquivo MANIFEST.MF, você não especificou a classe que contém o método main.

Assumindo que seu projeto no NetBeans seja um projeto Ant padrão, no NetBeans, nas propriedades do projeto (que já te indiquei em outro post), vc precisa indicar qual é a classe principal, ou seja, a classe que contém o método main que é o ponto de entrada do seu programa. Isso se faz na categoria “Run” e configurando a opção “Main Class”. Normalmente o NetBeans já faz isso na criação do projeto, entretanto vc deve ter mudado alguma coisa durante o desenvolvimento ou estar usando outro ponto de entrada na execução. JFrames por exemplo ganham um método main por padrão para testes, então talvez vc esteja rodando somente sua janela principal durante o desenvolvimento.

Ao dar um clean and build no seu projeto, a pasta dist será criada dentro da pasta do projeto. Nessa pasta haverá o arquivo .jar da aplicação e uma pasta, chamada lib, com as dependências da aplicação (caso haja dependencias). Para você distribuir sua aplicação, basta zipar a pasta dist e copiar para onde quer executar. Para rodar o .jar diretamente, a máquina cliente vai ter que ter o JDK ou a JRE instalados e seu sistema operacional reconhecendo que os arquivos .jar devem ser executados pelo java ou javaw. Há também a possibilidade de criar instaladores, que já carregam consigo uma cópia mínima da JRE necessária para sua aplicação executar. O gerador de instaladores se chama jpackge e é distribuído junto com o JDK, entretanto, para que ele funcione, ele precisa de uma “runtime” de instaladores chamada Wix (versão 3.x.x), que vai prover para esse empacotador toda a infraestrutura necessáira para criar o instalador.

1 curtida

Tudo bem, David Buzatto? Bom a classe está declarada junto com o nome do pacote (nomePacote.NomeClasse, da seguinte forma empresavi.EmpresaVI, está correto?) na opção run mas meu projeto não é ant é maven. O NetBeans não gera uma pasta dist (pelo meno eu não achei, talvez não tenha procurado corretamente) ele gera uma pasta target conforme a figura abaixo:

image

Note que tem um pote com o nome do arquivo jar que foi criado para o meu sistema, só que este arquivo foi criado em outro lugar (eu achei ele e tentei executar mas não aconteceu nada quando eu dei duplo clique nele).

Você tem me ajudado bastante. Obrigado. Considerando os dados que eu passei para você agora, gostaria de fazer mais algum comentário ou sugestão de ação para criarmos o executável que eu tanto anseio? A figura que você mandou foi muito útil!

Atenciosamente,
Ronaldo

Entendi. Falta vc configurar o pom.xml. Mande o conteúdo do seu arquivo poml.xml que eu altero e te passo de volta.

Vou te mandar o pom.xml conforme seu pedido…

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany</groupId>
    <artifactId>EmpresaVI</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>
        <dependency>
            <groupId>com.github.librepdf</groupId>
            <artifactId>openpdf</artifactId>
            <version>1.3.29</version>
        </dependency>
    </dependencies>
</project>

Este código acima é meu arquivo pom.xml. Se tiver algo errado pode alterar por favor.

Atenciosamente,
Ronaldo

Tá aí. Coloquei alguns comentários. A grande diferença foi a inserção do plugin de build maven-assembly. Esse é legal pois vai “explodir” as dependências do seu projeto e criar um jar com tudo junto, ou seja, com os arquivos compilados do seu projeto mais os arquivos compilados das bibliotecas, não precisando ficar carregando uma pasta de bibliotecas para sua aplicação. Após a atualização do POM provavelmente o NetBeans vai reclamar que seu projeto não está atualizado. Basta clicar com o botão direito no projeto e escolher “Resolver inconsistências” (ou algo do tipo).

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany</groupId>
    <artifactId>EmpresaVI</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>
        <dependency>
            <groupId>com.github.librepdf</groupId>
            <artifactId>openpdf</artifactId>
            <version>1.3.29</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <!-- altere abaixo para refletir qual o caminho da sua classe principal (a que tem o método main)-->
                            <!-- essa classe é a que vai ser executada ao executar o jar da sua aplicação -->
                            <mainClass>pacote.da.classe.principal.NomeDaClassePrincipal</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <appendAssemblyId>false</appendAssemblyId>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
1 curtida

Eu copiei o pom.xml que você me mandou e funcionou normal porém não está funcionando o jar. Ou seja, está dando um problema com o nome da classe. Apesar de eu ter modificado a linha que você falou não está funcionando (pacote.da.classe.principal.NomeDaClassePrincipal). Será que é sujeira ao compilar?

Enfim, eu dou clique duplo mas não executa o programa!

Atenciosamente,
Ronaldo

O caminho deve estar errado. Manda um print da estrutura do seu projeto e qual é a classe principal.

1 curtida

Cordiais saudações, David Buzatto.

Você me pediu um print da estrutura do projeto e o nome da classe principal. A classe principal chama EmpresaVI e está no pacote empresavi, então no pom eu coloquei empresavi.EmpresaVI. Agora quanto ao print da estrutura eu não sei se está certo mas entendo por estrutura a janela que tem o projeto e estou te mandando, se estiver errado preciso de orientação sobre o que é esse print da estrutura:

Eu fiz as modificações que você recomendou no pom e o tamanho do arquivo jar cresceu de 290 KB para 6 MB, acho normal considerando que agora o jar tem os arquivos anexos e não precisa de pastas para executar mas como eu falei antes não está rodando.

Obrigado,
Ronaldo

P.S.: Eureka! Eureka! Eureka! O sistema rodou!!! David, não precisa se preocupar mais o sistema carregou certinho quando eu dei clique duplo no jar. Eu tinha esquecido que era em dois lugares que tinha que colocar empresavi.EmpresaVI e agora esta correto. Muitíssimo obrigado, valeu. Agora está rodando!!! Agora está rodando, gente!!!

1 curtida

Opa, legal que funcionou Ronaldo.
Veja, na minha resposta eu coloquei coisa a mais… Só fui perceber isso agora, lendo que vc comentou que tinha que trocar em dois lugares. Não sei pq no projeto meu que eu copiei o que vc precisava eu tenho o <exec.mainClass> dentro de <properties>, o que é desnecessário. Foi algum teste que eu fiz e acabou ficando ali essa tag e eu esqueci de remover. Ou seja, pode remover. Veja como deve ficar então então (editei minha resposta original tbm):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany</groupId>
    <artifactId>EmpresaVI</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.25</version>
        </dependency>
        <dependency>
            <groupId>com.github.librepdf</groupId>
            <artifactId>openpdf</artifactId>
            <version>1.3.29</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>empresavi.EmpresaVI</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <appendAssemblyId>false</appendAssemblyId>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
1 curtida