I believe the easier way would be to diff the fileset of classes to be
packed to the fileset of classes in the jar before creating a new jar.
There's a tool called zipdiff that could do the trick (it may ignore
timestamps, etc). That would correspond to a javac deciding on whether to
recompile the classes (which is based on timestamps, I guess ;-). It sounds
to me like you're looking for an equivalent of ClearCase winkin. If that's
the case, have you read [1]?

Gintas

[1]
https://www.packtpub.com/books/content/ibm-rational-clearcase-challenges-java-development

2017-07-23 12:35 GMT+02:00 Stefan Bodewig <bode...@apache.org>:

> On 2017-07-22, George Bateman wrote:
>
> > I'm currently trying to make Processing <https://processing.org> build
> > reproducibly (so building it twice yields the exact same output file).
> > Currently this involves, as far as I can tell, unzipping every JAR
> > file, touching the files with a constant modification time, and
> > re-zipping it. (Even if you were to touch the .class files in advance,
> > there's MANIFEST.MF, which is created by Ant and which you have to
> > unzip to access.)
>
> The manifest may contain the current time stamp, to make things worse
> for you :-)
>
> I'm not sure what you want can be achieved at all. The best you can get
> is the exact same jar when the build has been run on the same OS with
> the same version of java, javac and zlib (and probably a few other
> things I'm missing right now).
>
> Different javacs will create different class files. ZIP (and thus JAR)
> creation uses zlib under the covers and different versions may result in
> different deflated output.
>
> > Unless there's some efficient way of doing this that I've missed,
> > could you advise me on how I'd go about writing a patch for Ant that
> > makes reproducible JARs easier? I'd been thinking of adding a
> > "modificationtime" attribute to the jar and zip tasks, and giving that
> > time to all the files, but I'd be grateful if you could give me a
> > rough idea of how Ant works and which files I'd need to be looking at
> > and editing.
>
> First of all you'd have to modify the class
> org.apache.tools.ant.taskdefs.Zip and add a setModificationtime method
> to it - this will create the attribute for both tasks, as the
> implementation of <jar> (org.apache.tools.ant.taskdefs.Jar) is a
> subclass of the Zip class. You'll need to think about what the value of
> the attribute should be - milliseconds since epoch? A formatted string
> containing the timestamp to set?
>
> And then you need to look for all places where Zip or Jar invoke setTime
> on a ZipEntry instance.
>
> Stefan
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@ant.apache.org
> For additional commands, e-mail: dev-h...@ant.apache.org
>
>

Reply via email to