[RESOLVIDO] IFDEF no Java

7 respostas
RenataFA

Gente, andei procurando aqui no GUJ e parece que em java eu não tenho nada parecido com o IFDEF do Delphi. Este tópico por ex explica isso: http://www.guj.com.br/posts/list/18385.java#95936

Mas como esse tópico é de 2004 e estamos em 2007, eu estou com a esperança de que já exista algo pra resolver esse meu probleminha…rs…

Então queria ver se alguém tem alguma dica de como posso “simular” o IFDEF.

O meu caso é o seguinte: tenho algumas verificações no sistema que só quero que sejam feitas qdo o programa for executado fora do ambiente de desenvolvimento (fora do Eclipse no meu caso).

Por ex, não quero que verifique número de licenças permitidas qdo estou rodando o programa pelo Eclipse.

Alguém teria alguma dica?!

Grata,

7 Respostas

T

Uma outra forma é olhar uma System.getProperty. Por exemplo, digamos que você queira ligar ou desligar uma flag de depuração no seu código.

boolean debug = false;
...
if ("debug".equals (System.getProperty ("seusistema.modo")) {
    debug = true;
}

e na hora de chamar seu programa (pelo Eclipse, digamos), passe o parâmetro -Dseusistema.modo=debug (no caso do Eclipse, você pode usar:
Run -> Run… -> escolha um projeto -> tab Arguments -> VM Arguments -> preencha com -Dseusistema.modo=debug.

O

Esta verificação está “concentrada” em apenas uma parte bem específica do seu código ou está “espalhado” pelo código? Se estiver “concentrado” a opção de um if e uma propertie para “ligar/desligar” acho que é o mais indicado. Se ele está muito “espalhado”, poderia tentar usar Annotation (que no fundo é quase mesma coisa que o if, só que mais “elegante” ;). O problema é que você vai ter que implementar este Annotation.

Daria para fazer algo também para pensar em algo que injetasse implementações diferentes de acordo com o seu ambiente.

Agora se o seu objetivo é gerar uma build diferente no seu ambiente de desenvolvimento, a opção de customizar o seu script de geração de build é a melhor opção.

kaique

Se você usasse assertions poderia resolver o seu problema??

[]'s.

RenataFA

everson_z:
Não conheço Delphi,

Você pode criar em arquivo .properties com uma chave informando que o ambiente é de desenvolvimento e com rotinas ligadas a essa chave.

Então, só que ai eu teria que ficar mudando manualmente o conteúdo desse properties toda vez que fosse compilar o programa pra distribuição… Num queria depender disso, queria algo mais automático.

thingol:
Uma outra forma é olhar uma System.getProperty. Por exemplo, digamos que você queira ligar ou desligar uma flag de depuração no seu código.

boolean debug = false;
...
if ("debug".equals (System.getProperty ("seusistema.modo")) {
    debug = true;
}

e na hora de chamar seu programa (pelo Eclipse, digamos), passe o parâmetro -Dseusistema.modo=debug (no caso do Eclipse, você pode usar:
Run -> Run… -> escolha um projeto -> tab Arguments -> VM Arguments -> preencha com -Dseusistema.modo=debug.

Eu fiz aqui o que vc falou e aparentemente funciona. Só me explica uma coisa, o que são os VM Arguments? Parâmetros pra minha VM? Program arguments eu já tinha usado (são os parâmetros passados pro programa).

Eu tenho diversos projetos, quero que isso funcione pra todos. Eu tenho que ir em cada projeto e criar esse VM Arguments?! Ou criando em um os demais “enxergam” essa propriedade?

Qdo eu gero o jar do projeto, essa tal VM Arguments de alguma forma vai pra lá?! A cada vez que eu executo minha VM tem que informar esse parâmetro ou o fato de eu ter rodado já esse VM Arguments com esse parâmetro uma vez indica que agora sempre essa propriedade já estará na minha VM?!

Esta opção está me parecendo a mais adequada no meu caso. Se puder me ajudar com essas perguntinhas eu agradeço.

oyama:
Esta verificação está “concentrada” em apenas uma parte bem específica do seu código ou está “espalhado” pelo código? Se estiver “concentrado” a opção de um if e uma propertie para “ligar/desligar” acho que é o mais indicado. Se ele está muito “espalhado”, poderia tentar usar Annotation (que no fundo é quase mesma coisa que o if, só que mais “elegante” . O problema é que você vai ter que implementar este Annotation.

Daria para fazer algo também para pensar em algo que injetasse implementações diferentes de acordo com o seu ambiente.

Agora se o seu objetivo é gerar uma build diferente no seu ambiente de desenvolvimento, a opção de customizar o seu script de geração de build é a melhor opção.

Então, essa verificação tende a ocorrer em vários lugares, mas pensando nisso eu já criei um método estatico acessível em qq momento no projeto e dentro dele eu faço as verificações que preciso retornando apenas um boolean.

Eu não sei praticamente nada sobre Annotation…

Não preciso gerar um build diferente no meu sistema de desenvolvimento não, só preciso saber se estou rodando dentro do Eclipse ou não.

kaique:
Se você usasse assertions poderia resolver o seu problema??

[]'s.

Tb. não sei o que são assertions… :oops:

T

“VM Arguments” são aqueles parâmetros que são passados para o java.exe mas não para o seu programa (em String args[]).
Se por exemplo seu programa (em uma linha de comando) fosse iniciado com:

java -Dseusistema.modo=debug -Xmx256m -classpath MeuJar.jar;SeuJar.jar meu.pacote.minha.Classe args1 args2 args3

os “VM Arguments” são aqueles que vão antes do nome da classe: -Dseusistema.modo=debug -Xmx256m -classpath MeuJar.jar;SeuJar.jar e os “Runtime arguments” são os que vão depois do nome da classe e são passados para String[] args: args1 args2 args3.

Se você precisa ir para cada projeto e criar esses VM Arguments?
Eu creio que sim.
É meio braçal e sujeito a erros isso.

Entretanto, se quiser criar um único arquivo .properties para todos os projetos, e ler essa configuração do properties, esteja à vontade. (Talvez seja melhor, já que funcionaria também com o NetBeans ou outros ambientes. )

RenataFA

Bom, por hora funcionou perfeitamente aqui.

Eu coloquei em todos os meus projetos no Eclipse, e como só rodo o programa no Eclipse (apesar de usar o Matisse do Netbeans pra parte gráfica) não preciso me preocupar com outros ambientes de desenvolvimento.

Nossas aplicações são distribuidas em executáveis (seja .exe ou .bin) e fiz de forma que qdo não encontrar esse argumento na VM ele assume o valor default. Isso pra mim é bom pq não quero que os usuários possam alterar o conteúdo desse parâmetro, e já que se trata de um parâmetro pra VM e depois de gerado o executável do programa ele deixa de usar VM, meu usuário não terá como alterar esse valor.

Enfim, obrigada pela ajuda e agradeço tb a dica dos demais!

:wink:

everson_z

Não conheço Delphi,

Você pode criar em arquivo .properties com uma chave informando que o ambiente é de desenvolvimento e com rotinas ligadas a essa chave.

Criado 3 de outubro de 2007
Ultima resposta 3 de out. de 2007
Respostas 7
Participantes 5