Como utilizar um pacote JAR externo ocasionalmente sem ter que importá-lo?

8 respostas
L

Bom dia Senhores,

Tenho a seguinte situação.
Possuo um pacote java multifuncional, no entanto para realizar uma de suas funções preciso importar um outro pacote X.
O problema é que esse pacote X tem 50mb e só é usado em específicas situações. Como faço para utilizar esse pacote X sem tem que importá-lo formalmente?

Eu havia tentado algo como:

try{

br.com.util.PacoteX pacX = new br.com.util.PacoteX();

}catch(Exception e){

return null;

}

Imaginei que o pacote X seria importado somente quando utilizado, e então ao dar falha eu trataria isto, mas não é o que ocorre, não compila.
Existe um modo de fazer esse procedimento?

Obrigado
Leonilson Lopes

8 Respostas

drsmachado

Não há como.
A diretiva import, colocada entre a declaração do package e do tipo de classe/enum/interface não pode ser “ocasional”.
Mesmo que você use uma única vez na vida, ele precisa estar lá.

sergiotaborda

Importar o pacote com a keyword import não afeta em nada o tamanho ou performance da sua aplicação. A classe só será carregada quando utilizada.
O import do java não é como o do C. No C significa “include” , no java significa apenas um atalho para não ter que escrever o nome qualificados das classes toda a hora.

Agora, se o jar onde está esse pacote tem 50 megas isso vai aumentar o tamanho do deploy mas o jar precisa estar no classpath quando for usado. Quando não for, vc pode simplesmente removê-lo ( mas se o codigo passar naquelas linha vai dar problema)

drsmachado

Tentar isso talvez resolva…

java -cp jar1:jar2:jar3:dir1:. HelloWorld

Mais aqui

GusMcCart

O amigo aí disse tudo, não é questão de importar ou não, o que precisa é estar no ClassPath no momento da compilação e posterior execução (Se não estiver no classpath após a compilação e você nunca usar, nunca vai lançar um ClassNotFoundException).

L

sergiotaborda:
Importar o pacote com a keyword import não afeta em nada o tamanho ou performance da sua aplicação. A classe só será carregada quando utilizada.
O import do java não é como o do C. No C significa “include” , no java significa apenas um atalho para não ter que escrever o nome qualificados das classes toda a hora.

Agora, se o jar onde está esse pacote tem 50 megas isso vai aumentar o tamanho do deploy mas o jar precisa estar no classpath quando for usado. Quando não for, vc pode simplesmente removê-lo ( mas se o codigo passar naquelas linha vai dar problema)

Meu drama não é o tamanho do pacote. Esse meu JAR multifuncional é utilizado por 2 softwares diferentes, a questão é que apenas 1 deles precisa desse pacote X de 50 megas. Então, eu não queria ter que fazer 2 JARs só porque eu preciso do import do pacote X e outro não. Logo, o pacote X está no classpath do software 1, mas não do software 2, mas isso não seria um problema, já que eu nem vou usá-lo. Então, estando o JAR multifuncional no software que não utiliza o pacote X, mesmo que eu chamasse o método, eu trataria o erro.

J

Você pode montar o seu próprio class loader e fazer a chamada por reflection…
Desta forma não é necessário o import no momento da compilação.

http://docs.oracle.com/javase/7/docs/api/java/net/URLClassLoader.html

sergiotaborda

[email removido:
]
sergiotaborda:
Importar o pacote com a keyword import não afeta em nada o tamanho ou performance da sua aplicação. A classe só será carregada quando utilizada.
O import do java não é como o do C. No C significa “include” , no java significa apenas um atalho para não ter que escrever o nome qualificados das classes toda a hora.

Agora, se o jar onde está esse pacote tem 50 megas isso vai aumentar o tamanho do deploy mas o jar precisa estar no classpath quando for usado. Quando não for, vc pode simplesmente removê-lo ( mas se o codigo passar naquelas linha vai dar problema)

Meu drama não é o tamanho do pacote. Esse meu JAR multifuncional é utilizado por 2 softwares diferentes, a questão é que apenas 1 deles precisa desse pacote X de 50 megas. Então, eu não queria ter que fazer 2 JARs só porque eu preciso do import do pacote X e outro não. Logo, o pacote X está no classpath do software 1, mas não do software 2, mas isso não seria um problema, já que eu nem vou usá-lo. Então, estando o JAR multifuncional no software que não utiliza o pacote X, mesmo que eu chamasse o método, eu trataria o erro.

não tem problema nenhum. faça o código com o jar no classpath e depois remova.

Se quizer fazer como deve ser, utilize o padrão Strategy. Crie duas classes, com o mesmo contrato (interface). Uma para usar no software que usa e uma para o que não usa. O resto do codigo chamará a interface, portanto está isolada a dependencia. E ai é só configurar de forma que a classe certa seja usada no produto certo ( o spring por exemplo ajudaria nisso)

L

sergiotaborda:
[email removido:
]
sergiotaborda:
Importar o pacote com a keyword import não afeta em nada o tamanho ou performance da sua aplicação. A classe só será carregada quando utilizada.
O import do java não é como o do C. No C significa “include” , no java significa apenas um atalho para não ter que escrever o nome qualificados das classes toda a hora.

Agora, se o jar onde está esse pacote tem 50 megas isso vai aumentar o tamanho do deploy mas o jar precisa estar no classpath quando for usado. Quando não for, vc pode simplesmente removê-lo ( mas se o codigo passar naquelas linha vai dar problema)

Meu drama não é o tamanho do pacote. Esse meu JAR multifuncional é utilizado por 2 softwares diferentes, a questão é que apenas 1 deles precisa desse pacote X de 50 megas. Então, eu não queria ter que fazer 2 JARs só porque eu preciso do import do pacote X e outro não. Logo, o pacote X está no classpath do software 1, mas não do software 2, mas isso não seria um problema, já que eu nem vou usá-lo. Então, estando o JAR multifuncional no software que não utiliza o pacote X, mesmo que eu chamasse o método, eu trataria o erro.

não tem problema nenhum. faça o código com o jar no classpath e depois remova.

Se quizer fazer como deve ser, utilize o padrão Strategy. Crie duas classes, com o mesmo contrato (interface). Uma para usar no software que usa e uma para o que não usa. O resto do codigo chamará a interface, portanto está isolada a dependencia. E ai é só configurar de forma que a classe certa seja usada no produto certo ( o spring por exemplo ajudaria nisso)

Obrigado amigos pelas respostas.
Optei por utilizar a opção de polimorfismo. Criei um pacote generico e universal e um com as alterações polimorficas necessárias, que serve de “interface” do pacote universal. Assim o pacote universal sozinho atente o sistema X e o pacote universal + pacote “interface” atente do sistema Y.

Leonilson Lopes

Criado 10 de agosto de 2012
Ultima resposta 3 de set. de 2012
Respostas 8
Participantes 5