Mascarando palavras reservadas na linha de comando do Windows

2

Eu tenho um programa em Java que preciso iniciar com um comando como este:

java -cp "some.jar;some2.jar" -Dsome.prop.dir=C:\somedir com.software.MainClass

Agora, o problema aqui é o parâmetro -Dsome.prop.dir=C:\somedir - por algum motivo, o Java falha com Could not find or load main class com.software.MainClass . Se eu deixar de fora esse parâmetro, o programa inicia bem, mas obviamente, o poperty não está definido.

Eu estou supondo que talvez seja beacause dir é uma palavra reservada no Windows. Existe alguma maneira de, talvez, mascarar ou contornar isso, além de alterar o aplicativo Java ou criar algum lançador binário / PE especial para o aplicativo Java no Windows?

    
por GreenGren 25.03.2018 / 21:22

1 resposta

0

Não tenho uma solução, mas alguns testes e recomendações para investigar seu problema.

Eu tentei reproduzir o problema que você descreve. Eu até criei os nomes falsos (diretório somedir, classe Mainclass).

Aqui está minha versão do Mainclass. Essencialmente, ele obtém a propriedade do sistema e a utiliza para gerar alguma saída de diagnóstico simples.

package com.software;

import java.io.File;

public class Mainclass {

    public static void main(String[] args) {
        String someDir = System.getProperty("some.prop.dir");
        if (someDir == null || someDir.isEmpty()) {
            System.out.println("No directory parameter specified");            
        } else {
            File dir = new File(someDir);
            System.out.println(String.format("Directory stats: %s, %s, %s", someDir, dir.getAbsolutePath(), dir.isDirectory() ? "directory" : "file"));
        }
        System.out.println("Main running okay.");
    }      
}

Em seguida, criei um arquivo jar contendo Mainclass e o nomeie some.jar.

Eu corri a linha de comando da seguinte forma:

java -cp "some.jar" -Dsome.prop.dir=C:\somedir com.software.Mainclass

Resultados:
        Estatísticas do diretório: C: \ somedir, C: \ somedir, diretório
        Principal funcionando bem.

Eu também corri sem o parâmetro -D:

java -cp "some.jar" com.software.Mainclass

Resultados:         Nenhum parâmetro de diretório especificado
        Principal funcionando bem.

Embora eu conseguisse resolver o problema sem problemas, vi alguns lugares onde o problema poderia existir:

  1. Os arquivos jar. Você está especificando o caminho de classe para ser os primeiros 2 nomes de arquivos. Mainclass precisa estar em um deles ou não será encontrado. Eu suspeito que este não é o problema, uma vez que é executado corretamente sem o parâmetro -D.
  2. O parâmetro -D é usado internamente para localizar a classe. No código de exemplo acima, estou apenas relatando no diretório. Talvez você esteja usando para localizar o arquivo de classe de alguma forma, e ele não pode encontrá-lo? Talvez o programa use o diretório para procurar a classe, mas quando você omite o diretório, o padrão é usar aquele especificado no arquivo jar?

Se eu corri no diretório bin (onde as classes foram geradas), eu pude omitir o comando -cp e ele funcionou corretamente.

Se eu usasse -cp com um jar sem Mainclass, recebi o erro, mas entendi se -D foi especificado.

    
por 19.04.2018 / 16:52