Java Web Start - Descompactando o conteúdo do JAR

Olá.

Possuo uma aplicação web que deve rodar, as vezes, de maneira offline (em notebooks de consultores externos e tals).
Pra isso, estou utilizando uma versão embbeded do Tomcat. Esta minha aplicação acessa um diretorio /web com o conteudo e um /conf com as configurações do Tomcat.
Consegui resolver o problema do banco usando o H2 embbeded tbm… fazendo sincronia depois com o BD online e tals… enfim, funciona.

Assim sendo, eu queria utilizar o Java Web Start para distribuir esta aplicação (pelas vantagens de manter os clients atualizados facilmente, de o JWS já fazer as verificações de JRE, etc).
Pelo que pesquisei, o JWS permite apenas que vc publique os JARs para executar, e não estes demais diretórios que meu server precisa.
Assim sendo, eu pensei em colocar estes diretórios dentro do JAR, e qdo eu invocar minha classe Main, ela descompactaria estes diretórios para uma pasta temporaria.

Eu já fiz alguns testes… assinei todos os meus JARs… criei diretórios e arquivos de teste em System.getProperty(“java.io.tmpdir”);, etc.
A minha dificuldade está em acessar este diretorio de dentro do meu proprio JAR para descompactá-lo, utilizando o ZipFile ou algo assim…

Tentei passar o getClass().getClassLoader().getResource(“XX”).toURI() pro construtor do ZipFile, mas a URL aparece como "localhost:8080 … " qdo executado pelo JWS… e assim o construtor não funciona…

Eu ate poderia colocar estes arquivos e diretorios em outro JAR fora da minha aplicação, mas ainda assim não sei como encontrá-la usando o JWS…

Alguma luz, ou algo diferente que eu não tenha pensado?
Ou será que existe alguma maneira de conseguir o Real Path (c:/algumacoisa/app.jar) deste meu JAR atraves de minha classe que está dentro dele?

Desde já, agradeço.

Ja tive este problema tambem…tenta usar getClass().getClassLoader().getResourceAsStream(“XXX”), como abaixo :

    InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(nomeArquivoDentroQualquerJarJNLP);

Flws.

Então…

eu já havia tentado com o ClassLoader… mas não estava conseguindo utilizar os resources, pra fazer outputstream pq estavam como diretórios dentro do JAR, e não arquivos.

acho q o problema é que eu estava o dia de ontem inteiro bitolado nisso, e não enxerguei uma solução pra resolver…
hoje pela manhã, em alguns minutos com a mente mais leve, consegui resolver meu problema…

usando o ClassLoader, eu consegui carregar um arquivo ZIP que adicionei ao meu JAR, através do ZipInputStream.
agora está funcionando blzinha… :wink:

Caso alguem precise, minha estrutura ficou + ou - assim:

- tomcat-emb.jar:
     - META-INF (...)
     - install-app.zip
     - Tomcat55.class

dae na minha classe Tomcat55, fiz algo assim:

        	String tempDirName = System.getProperty("java.io.tmpdir") + "minhaApp" + File.separatorChar;
        	File tempDir = new File(tempDirName);
        	tempDir.mkdirs();

        	ZipInputStream zipStream = new ZipInputStream(tomcat.getClass().getClassLoader().getResourceAsStream("install-app.zip"));

        	ZipEntry entry = null;
        	while ((entry = zipStream.getNextEntry()) != null) {
        		String entryName = entry.getName();
        		System.out.println("Entry: " + entryName);
        		String entryFullName = tempDirName + entryName;
				if (entry.isDirectory()) {
					new File(entryFullName).mkdirs();
				} else {
					// Montar diretorios ate chegar ao arquivo
					String sep = "" + File.separatorChar;
					if (entryName.indexOf(sep) <= 0) {
						if (entryName.indexOf("/") > 0) {
							sep = "/";
						} else if (entryName.indexOf("\\") > 0) {
							sep = "\\";
						}						
					}
					StringTokenizer token = new StringTokenizer(entryName, sep);
					String pathName = tempDirName;
					while (token.hasMoreElements()) {
						Object elmPath = token.nextElement();
						// O ultimo eh o arquivo... nao gera diretorio
						if (token.hasMoreElements()) {
							pathName += elmPath.toString() + File.separatorChar;
						}
					}
					
					// Se o diretorio nao existe, crie
					if (!pathName.equals(tempDirName)) {
						new File(pathName).mkdirs();
					}
					
			        FileOutputStream output = new FileOutputStream(entryFullName);
			        for (int c = zipStream.read(); c != -1; c = zipStream.read()) {
			        	output.write(c);
			        }
					
			        zipStream.closeEntry();
		        	output.close();
				}
			}
        	
        	zipStream.close();

so dar uma estudada melhor no JWS pra otimizar a atualização de versões e tals agora… separar melhor os resources e coisas do tipo…

vlw a ajuda.