[RESOLVIDO] Swing Desktop + Hibernate + Maven: Hibernate não funciona após o jar ser gerado

Boa noite pessoal!

Estou com um problema, gostaria de saber se alguém já passou por esta situação:

Estou com a configuração: NetBeans 7.0 + Hibernate 3.5.6 + Maven 2 + MySQL 5.1.

Tenho uma aplicação java desktop que funciona perfeitamente quando executo na IDE. O hibernate cria as tabelas, os mapeamentos estão funcionando perfeitamente, consigo adicionar e consultar dados, etc. O maven faz a build sem nenhum erro.

O problema é quando vou gerar o jar da aplicação para disponiblizar ao usuário: Executando o jar, a aplicação abre, mas não consegue incluir nada no banco, nem consultar, e o engraçado é que não aparece erro no log nem no JOptionPane! rs

Alguém tem alguma idéia? Quando está executando na IDE funciona normalmente. O problema é quando testo no jar gerado.

Meu arquivo de configuração do hibernate está assim:

public class HibernateUtil
{
    private static final SessionFactory sessionFactory = buildSessionFactory();

    @SuppressWarnings("unchecked")
    public static SessionFactory buildSessionFactory()
    {
        AnnotationConfiguration conf = new AnnotationConfiguration();
        //Configurar um interceptador
        //conf.setInterceptor(new Interceptador());
        SessionFactory factory = null;

        try
        {
            conf.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
            conf.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
            conf.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/meubanco");
            conf.setProperty("hibernate.connection.username", "usuario");
            conf.setProperty("hibernate.connection.password", "senha");
            conf.setProperty("hibernate.show_sql", "false");
            conf.setProperty("hibernate.format_sql", "false");
            conf.setProperty("hibernate.hbm2ddl.auto", "update");

            // Classes mapeadas - Tudo ok aqui!
            conf.addAnnotatedClass(MinhaClasse1.class);
            conf.addAnnotatedClass(MinhaClasse2.class);          
            
                        
            factory = conf.buildSessionFactory();
        }
        catch (Exception e)
        {
            JOptionPane.showMessageDialog(null, "Erro ao carregar HibernateUtil: " + e.getMessage(), "Erro", 0);
        
        }
        return factory;
    }

    public static SessionFactory getSessionFactory()
    {
        return sessionFactory;
    }
}

about:startpage

repare que você está colocando no endereço do banco o localhost.
Ou seja ele também terá que ter o banco de dados, caso não seja esse o seu interesse coloca o ip do servidor.

O melhor que você poderia fazer seria colocar essas configurações em um arquivo, assim você não teria problemas em configurar para onde fosse seu jar.

Bom dia!

No meu caso, seria localhost mesmo, pois é um aplicativo para rodar local na estação do usuário (não em rede, nem em um servidor). O MySQL já está instalado na estação com o database criado. O usuário, senha e string de conexão estão funcionando, fiz o teste dentro do MySQL Workbench.

O problema é que, até mesmo na minha máquina de desenvolvedor, a aplicação funciona quando executo pela IDE (com essas configurações), mas quando gero o jar e vou testar (na minha máquina), ai ela abre mas não faz nada com o banco!

Achei que com o hibernate 3.5, por aceitar annotations, bastaria eu configurar pela classe mesmo, e não no xml. Você tem algum exemplo de arquivo configurado? E como eu faria para lêr o arquivo? Dentro da classe main?

Não sei se é o caso, mais talvez seja algo do maven para gerar o jar embutido com as libs e configurações do hibernate… não tenho certeza!

Se alguém tiver mais alguma ideia, será bem vinda!

Obrigado!

Consegui pessoal!

O problema era com o build do Maven.

Achei na documentação do maven que, por padrão, ele não gera o jar com as dependências. Para isso, precisamos utilizar um plugin do maven chamado maven-assembly-plugin (http://maven.apache.org/plugins/maven-assembly-plugin/usage.html)

Resumindo, bastou colocar no meu pom.xml assim:

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2.1</version>
                <configuration>                    
                    <archive>
                        <manifest>
                            <mainClass>br.com.meuprojeto.Main</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id> <!-- this is used for inheritance merges -->
                        <phase>package</phase> <!-- bind to the packaging phase -->
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

Assim o maven cria, na fase package, dois jars no padrão:

  • sample-1.0-SNAPSHOT.jar
  • sample-1.0-SNAPSHOT-jar-with-dependencies.jar

Este segundo jar vem com todas as dependências embutidas.

Obrigado! :smiley:

1 curtida

Tenho projetos em netbeans que utilizam a estrutura Ant do netbeans… E quando na construção do projeto ele cria a pasta DIST com o .jar do projeto e a pasta lib para as dependências e talz…

Como fazer em Maven, esta mesma estruturação de Build de projeto SwingDesktop?