Como utilizar um pacote JAR externo ocasionalmente sem ter que importá-lo?
8 respostas
L
leonilson_lopes
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?
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?
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)
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
leonilson_lopes
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
jmmenezes
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.
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
leonilson_lopes
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.