What are the complete specifications that must be documented in order to ensure the correct execution of a particular program written in Java? For instance, if one were archiving a program for long-term preservation, and no testing or porting would be done.

I need to be able to compile and execute the Java program. Thus preserving the byte code or capturing the whole thing as a VMware image are excluded. The JVM could be saved as a VMware image though, and compiled libraries that are linked to the compiled code are OK, too. However, if there are dependencies on the OS, the architecture of the machine executing the JVM, the networking environment, external libraries, specification of the Java version used, etc. etc. these must all be listed. Some tech leaders in Dig Pres claim that any program written in Java will be executable "forever". How to do it?

  • 2
    $\begingroup$ I think the question would be better if you could elaborate a little more. $\endgroup$ Apr 25, 2012 at 7:25
  • 2
    $\begingroup$ I am confused by the melange of tags. What kind of specifications are you asking for: method interfaces, hardware specification, formal semantics, runtime system spec, ...? $\endgroup$
    – Raphael
    Apr 25, 2012 at 7:54
  • $\begingroup$ Does the Java code run stand-alone on one machine or multiple machines? If it is one machine, then does it have to be a specification or can the whole machine be saved as a virtual machine, i.e. VMware? $\endgroup$
    – Guy Coder
    Apr 25, 2012 at 10:51
  • $\begingroup$ @AlextenBrink I don't know, I could see a link, by interpreting the question as asking how it might be possible to encode a program (or one or all of its possible executions) so that it can always be used in the future. I think it's on-topic, but possibly very broad, bordering on not being a real question (what assumptions can you make about people trying to interpret this program?) $\endgroup$
    – Patrick87
    Apr 25, 2012 at 18:09
  • 2
    $\begingroup$ @MicahBeck: the question you initially posed was way too localized, the question you apparently want to ask is more general (but not overly general, so that's not a problem). Furthermore, by the way you were talking about all kinds of specifics such as VMware led me to believe you were actually interested in knowing how to ensure that your own Java programs still work in the future, rather than in knowing the concepts behind it. I suggest you reword your question appropriately (or leave that to us :)). I'll delete this comment if the question is updated as I apparently misunderstood you. $\endgroup$ Apr 25, 2012 at 19:54

1 Answer 1


Hoeven et al. studied the problem of digital preservation through emulation:

... Digital preservation does not end with the careful storage of digital objects. In order to keep these objects accessible, a continuous effort towards the development of strategies for permanent access is required ....

They ended up with a modular emulation model and the need of an Universal Virtual Machine (UVM):

... The basis of the modular emulation model is founded on the Universal Virtual Machine (UVM). The UVM is a platform- and time-independent layer on top of the underlying future host platform. As a result, programs that are developed for the UVM will continue to work even if the host platform changes. It not only consists of a general purpose processor and memory, but also offers additional functionality for input and output (I/O) communication with peripheral devices (like keyboard, storage, graphics, networking) between host and target platform. This will be provided by the interface layer.

.. and started the "Dioscuri project": a modular emulator for digital preservation. Not surprisingly, they chose Java to implement it:

... Java has been chosen as programming language. The main reason is its possibility to run Java code on a large variety of computer platforms using the Java Virtual Machine (JVM) without the need to recompile the source code. Recompilation is a risk factor since program code is adapted to a specific underlying computer platform. Although today’s compilers are very advanced, it can still result in different functionality of the same emulator compiled for different platforms. By avoiding this step, the emulator will be more stable and portable. Using the JVM instead provides similar results to the use of a UVM as discussed above....

The papers:

EDIT: the last changelog of the Dioscuri project is dated: 19-Jan-2011 ... so - perhaps - a new project/research should be started: "How to preserve the digital preservation tools?" :-D :-D

EDIT 2: just my personal opinion: if the Java program does useful things, humanity will preserve it without the need of any efforts by its author :-)

  • $\begingroup$ The UVM project went for the "end of history" answer. Choose a VM model and declare that it will be available "forever" and then preserve code by targeting that immutable platform. The problem, as we can already see in the Dioscuri project, is that forever is a very long time for an immutable target to be maintained. However, it does seem that the Dioscuri folks did pretty good job of enumerating the dependencies of a program compiled for a UVM environment. They just didn't manage to preserve the tools that satisfy those dependences (their funding probably ran out). $\endgroup$
    – Micah Beck
    Apr 25, 2012 at 20:01

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.