Mkdir gera pastas em locais diferentes (linha de comando X 2 cliques no jar)

7 respostas
Luiz_Augusto_Prado

Olá pessoal.

problema com programa para desktop:
depois que faço meu arquivo jar, tenho 2 opções para executa-lo:
dando 2 cliques no jar
ou em linha de comando fazer “java -jar nomejar.jar”

Só que esse jar possiu um mkdir que quando é executado em linha de comando, cria a pasta na mesma pasta do jar.
Já quando dou dois cliques no jar, ele cria na pasta raiz.

Por que isso? Como faço para que em abos os modos a pasta seja criada na mesma pasta do meu jar?

7 Respostas

gaulix

Podes postar a parte do seu código com o mkdir?
Talvez o erro esteja na forma como você pega o caminho do jar pra criar

Luiz_Augusto_Prado

gaulix:
Podes postar a parte do seu código com o mkdir?
Talvez o erro esteja na forma como você pega o caminho do jar pra criar

File pasta = new File("nomepasta")
pasta.mkdir();
E

Quando você inicia o programa via linha de comando, o diretório corrente é o do prompt. Exemplo:

cd \users\luiz\projetos
java -jar SeuProjeto.jar

Neste caso, o diretório corrente é c:\users\luiz\projetos

Quando você inicia o programa via duplo clique, o diretório corrente é normalmente o diretório onde está o javaw.exe. Por exemplo, na minha máquina:

C:\>assoc | findstr "jar"
.jar=jarfile

C:\>ftype | findstr "jarfile"
jarfile="C:\Program Files\Java\jre7\bin\javaw.exe" -jar "%1" %*

C:\>

O comando assoc indica qual é a associação entre a extensão jar e o tipo (“MIME Type”) usado pelo Windows para iniciar um programa.
O comando ftype indica, dada uma associação (neste caso o nome é “jarfile”), qual é o comando usado pelo Windows para iniciar um programa a partir de de um arquivo com extensão .jar.

Luizao

Eu uso o seguinte método nesses casos:

private String getJarFolder() {
        // get name and path
        String name = getClass().getName().replace('.', '/');
        name = getClass().getResource("/" + name + ".class").toString();
        // remove junk
        name = name.substring(0, name.indexOf(".jar"));
        name = name.substring(name.lastIndexOf(':')-1, name.lastIndexOf('/')+1).replace('%', ' ');
        // remove escape characters
        String s = "";
        for (int k=0; k<name.length(); k++) {
          s += name.charAt(k);
          if (name.charAt(k) == ' ') k += 2;
        }
        return s;
    }

Assim vc pega o caminho completo do jar, pode ser que te ajude.

Luiz_Augusto_Prado

Luizao:
Eu uso o seguinte método nesses casos:

private String getJarFolder() {
        // get name and path
        String name = getClass().getName().replace('.', '/');
        name = getClass().getResource("/" + name + ".class").toString();
        // remove junk
        name = name.substring(0, name.indexOf(".jar"));
        name = name.substring(name.lastIndexOf(':')-1, name.lastIndexOf('/')+1).replace('%', ' ');
        // remove escape characters
        String s = "";
        for (int k=0; k&lt;name.length(); k++) {
          s += name.charAt(k);
          if (name.charAt(k) == ' ') k += 2;
        }
        return s;
    }

Assim vc pega o caminho completo do jar, pode ser que te ajude.

Lembrei como fazia.
Para o programa funcionar eu colocava o Main do programa fora do pacote e criava um bat para executar o jar.
OBS: Alguem sabe dizer porque não é recomendável colocar classes (meu Main por exemplo) fora do pacote?

Uma idéia que tive para evitar que o usuário chame diretamente o jar, é implementar com esse seu código a busca pelas pastas que quero. Se ela não existir, lanço uma mensagem para o usuario informando que o arquivo de execução é o bat.

Pessoal, muitissimo obrigado à todos pelas respostas.

>

E

A menos que a classe seja o ponto de entrada do programa (no seu caso o Main), eu não recomendo deixar outras classes fora do pacote.
É que você não consegue importar direito essas classes em alguns ambientes (como por exemplo, dentro de um JSP).

Luiz_Augusto_Prado

A menos que a classe seja o ponto de entrada do programa (no seu caso o Main), eu não recomendo deixar outras classes fora do pacote.
É que você não consegue importar direito essas classes em alguns ambientes (como por exemplo, dentro de um JSP).

Então quanto ao ambiente desktop fico tranquilo. Obrigado pela resposta.

Criado 17 de setembro de 2012
Ultima resposta 18 de set. de 2012
Respostas 7
Participantes 4