On Thu, 19 Aug 2010 09:57:13 -0400, John B. Matthews wrote:
In article <i4hphp$qit$1@localhost.localdomain>,
Martin Gregorie <martin@address-in-sig.invalid> wrote:
I need to be able to replace a default resource file with a
site-specific one. Currently I'm doing the job with a bash script that
builds the replacement resource file and then runs jar in update mode
to put the new resource into the jarfile.
This works and works well, but isn't particularly portable, so I looked
into writing a Java utility, but the java.util.jar and/or java.util.zip
packages don't seem to be able to replace files in an existing jar
file.
I've thought of a few other approaches using portable scripting tools:
- Python: but not all machines have it installed - Perl: same problem
and the install is even bigger than Python - Jython: the jars etc. are
large and installation not so simple
on some systems
If I have to use any of these I'll recode the bash script in Python
because that looks to be a relatively simple install on, say, Windows.
What else would work?
Could you invoke `jar u...` via exec() or ProcessBuilder?
<http://download.oracle.com/javase/6/docs/technotes/tools/windows/
jar.html>
I'd considered that but when I posted that I was wondering if there was
anything, such as an expanded java.util.jar package, available that would
provide a built-in solution. This morning I bit the bullet and did what
you suggested, but used Runtime.exec() rather than ProcessBuilder because
the requirement is very simple with no need to change any environment
variables or the working directory.
Its working well. I haven't had any problems with access conflicts
despite launching the program from the jar file that is being modified.
When I was researching 3rd party packages I'd seen a comment that this
wasn't a problem provided that all needed classes have been loaded from
the jar file before you start modifying it. That seems to be true.
Now I've got this running, I see that jar is not part of the standard
JRE. Is there any reason I couldn't use zip instead? I know I can quickly
try it with the Linux zip and the arguments are even similar:
zip -u MailArchive.jar ma/mailarchive.conf
instead of
jar -uvf MailArchive.jar ma/mailarchive.conf
but what I can't remember is if the first command would also work with a
Windows zip binary or even if there is a version called zip.exe that
implements the -u option.
Windows doesn???t come with a zip utility. The most commonly used one,
WinZip, needs to be purchased. The Windows Explorer can display zip files
(including jars) as if they were directories, but that doesn't help you.
end. What jar uf does is create a new jar with changed contents and replace
the original jar with it. The most portable solution for you is to do the
same. Or find open source code that does this; I'd be surprised if you can't
find some.