Estou tentando encontrar um caminho para um Recurso, mas não tive sorte.
Isso funciona (no IDE e com o JAR), mas desta forma não consigo encontrar o caminho para um arquivo, apenas o conteúdo do arquivo:
ClassLoader classLoader = getClass().getClassLoader();
PrintInputStream(classLoader.getResourceAsStream("config/netclient.p"));
Se eu fizer isso:
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("config/netclient.p").getFile());
O resultado é:
java.io.FileNotFoundException: file:/path/to/jarfile/bot.jar!/config/netclient.p (No such file or directory)
Existe uma maneira de obter um caminho para um arquivo de recurso?
Respostas:
Isso é deliberado. O conteúdo do "arquivo" pode não estar disponível como um arquivo. Lembre-se de que você está lidando com classes e recursos que podem fazer parte de um arquivo JAR ou outro tipo de recurso. O carregador de classes não precisa fornecer um identificador de arquivo para o recurso, por exemplo, o arquivo jar pode não ter sido expandido em arquivos individuais no sistema de arquivos.
Tudo o que você pode fazer obtendo um arquivo java.io.File pode ser feito copiando o fluxo em um arquivo temporário e fazendo o mesmo, se um arquivo java.io.File for absolutamente necessário.
fonte
Ao carregar um recurso, observe a diferença entre:
e
Eu acho que essa confusão está causando a maioria dos problemas ao carregar um recurso.
Além disso, quando você está carregando uma imagem, é mais fácil usar
getResourceAsStream()
:Quando você realmente precisa carregar um arquivo (sem imagem) de um arquivo JAR, pode tentar o seguinte:
fonte
bin
pasta e vá para o diretório da classe que carrega os recursos antes de usar o caminho `/com/myorg/filename.ext '.A resposta de uma linha é -
Basicamente, o
getResource
método fornece a URL. A partir desta URL, você pode extrair o caminho chamandotoExternalForm()
Referências:
getResource () , toExternalForm ()
fonte
file:/
ao percurso, que trabalha no frasco, mas não no IDEPassei um tempo brincando com esse problema, porque nenhuma solução que encontrei realmente funcionou, por incrível que pareça! O diretório de trabalho freqüentemente não é o diretório do JAR, especialmente se um JAR (ou qualquer outro programa) for executado no menu Iniciar do Windows. Então, aqui está o que eu fiz, e ele funciona para arquivos .class executados de fora de um JAR, assim como funciona para um JAR. (Eu só testei no Windows 7.)
fonte
se
netclient.p
estiver dentro de um arquivo JAR, ele não terá um caminho porque esse arquivo está localizado dentro de outro arquivo. Nesse caso, o melhor caminho que você pode ter é realmentefile:/path/to/jarfile/bot.jar!/config/netclient.p
.fonte
Você precisa entender o caminho dentro do arquivo jar.
Basta referir-se a ele relativo. Portanto, se você possui um arquivo (myfile.txt), localizado em foo.jar, no
\src\main\resources
diretório (estilo maven). Você se referiria a ele como:Se você despejar seu jar usando
jar -tvf myjar.jar
, verá a saída e o caminho relativo dentro do arquivo jar e use o FORWARD SLASHES.fonte
File.separator
.No meu caso, usei um objeto URL em vez de Path.
Arquivo
Recurso no caminho de classe usando o classloader
Quando preciso ler o conteúdo, posso usar o seguinte código:
E você pode acessar o conteúdo usando um InputStream.
fonte
É o mesmo código do usuário Tombart com fluxo liberado e fechado para evitar a cópia incompleta do conteúdo do arquivo temporário do recurso jar e ter nomes de arquivos temporários exclusivos.
fonte
Um arquivo é uma abstração para um arquivo em um sistema de arquivos, e os sistemas de arquivos não sabem nada sobre o que é o conteúdo de um JAR.
Tente com um URI, acho que existe um protocolo jar: // que pode ser útil para seus proponentes.
fonte
O seguinte caminho funcionou para mim:
classpath:/path/to/resource/in/jar
fonte
Obter isso
getSystemResourceAsStream
é a melhor opção. Ao obter o fluxo de entrada em vez do arquivo ou da URL, funciona em um arquivo JAR e como autônomo.fonte
Pode ser um pouco tarde, mas você pode usar minha biblioteca KResourceLoader para obter um recurso do seu jar:
fonte
Quando em um arquivo jar, o recurso está localizado absolutamente na hierarquia de pacotes (não na hierarquia do sistema de arquivos). Portanto, se você tiver a classe com.example.Sweet carregando um recurso chamado "./default.conf", o nome do recurso será especificado como "/com/example/default.conf".
Mas se estiver em uma jarra, não será um arquivo ...
fonte
Dentro da pasta de recursos (java / main / resources) do seu jar, adicione seu arquivo (assumimos que você adicionou um arquivo xml chamado imports.xml ), depois injete
ResourceLoader
se usar Spring como abaixoescreva o código abaixo para carregar o arquivo:
fonte
Talvez este método possa ser usado para solução rápida.
fonte
java.lang.NullPointerException: Attempt to invoke virtual method 'java.security.CodeSource java.security.ProtectionDomain.getCodeSource()' on a null object reference
siga o código!
/ src / main / resources / file
fonte