Aplicação Java x Caminho do Arquivo.xml

Sistema Operacional: Linux Mint.

Enquanto estou no JDK Netbeans, eu faço uma busca no settings.xml por informações de conexão com o MySQL dentro da pasta lib que criei dentro do src. e tudo funciona perfeitamente.

Quando exporto o JAR para começar a usar a aplicação, copio o arquivo.xml para dentro da pasta lib e o erro que aparece é:


Não estou rodando a aplicação em /home …
Ele não deveria pegar o caminho relativo ao JAR?

Meu código está assim:

public Connection getConnect() throws JDOMException, IOException {
    File f = new File("lib/settings.xml").getCanonicalFile();
    SAXBuilder builder = new SAXBuilder();
    Document doc = builder.build(f);
    
    Element root = (Element) doc.getRootElement();
    List grupo = root.getChildren("database");
    Iterator i = grupo.iterator();

    while (i.hasNext()) {
        Element tag = (Element) i.next();

        host = tag.getChildText("db_Host");
        database = tag.getChildText("db_Database");
        ssl = tag.getChildText("db_SSL");
        username = tag.getChildText("db_Username");
        password = tag.getChildText("db_Password");
    }

    url = "jdbc:mysql://" + host + "/" + database + "?useSSL=" + ssl;

    try {
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection(url, username, password);
        JOptionPane.showMessageDialog(null, "Conexao efetivada com exito.", "SUCESSO", 1);
        
        return con;
    } catch (SQLException | ClassNotFoundException ex) {
        JOptionPane.showMessageDialog(null, "Erro ao tentar conectar o Banco de Dados.\n\nMotivo:\n" + ex, "FALHA", 0);
        return null;
    }
}

Resumindo: não importa onde eu esteja executando o meu JAR. Ele SEMPRE vai procurar o XML dentro de /home/fabio. Como faço para corrigir isso?

Que tal colocar assim?

File f = new File(getClass().getResource("/lib/sttings.xml")).getCanonicalFile();

1 - getClass() - de acordo com a documentação (veja aqui):

Retorna a classe de tempo de execução deste objeto. O objeto de classe retornado é o objeto que está bloqueado por métodos sincronizados estáticos da classe representada.

2 - getResource(String name) - a documentação indica(aqui):

Retorna um objeto de URL; null se nenhum recurso com esse nome for localizado, o recurso não puder ser localizado por uma URL, o recurso estará em um pacote que não esteja aberto para pelo menos o módulo do responsável pela chamada ou o acesso ao recurso será negado pelo gerenciador de segurança.

Teoricamente, irá encontrar o recurso com base no objeto em execução, ou seja, o path vai usar como endereço raiz o endereço da classe que tenha um objeto em execução. Assim, supondo que o jar esteja em C:Users/Desktop, o método getResource(String name) irá retornar: C:Users/Desktop/lib/sttings.xml.

1 curtida

Amigo, testei a sua dica aqui. Apareceu uma informação dizendo que o método não pode ser convertido à STRING. Apesar de eu nunca ter usado o método .getCanonicalFile() quando usava o Windows, agora o erro mudou e, de fato, a aplicação deixou de procurar na minha HOME mas ainda diz que o arquivo não existe (!). Ele agora está buscando o settings.xml no caminho correto: /lib/settings.xml.


Porque será que ele não encontra o XML lá dentro?

Percebi que ele está tentando procurar o XML dentro da pasta nativa lib do Linux: /lib/