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

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?

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

[quote=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[/quote]

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

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.

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.

[quote=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.[/quote]

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.

>

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

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). [/quote]

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