Elena realized she didn't need the GUI. She didn't need the JNLP launcher. She needed the transformation pipeline.
She closed her laptop at 11:47 PM. On the screen, a single line of Python remained: convert jnlp to pdf
She spent six hours trying to mimic the JNLP's environment. She set up a Windows XP virtual machine. She installed Java 6 update 21. She disabled all security updates. She copied the exact JARs from the old server's cache. Still, the application would launch, show a gray window, and crash with a NullPointerException at a line that simply read: String s = null; s.length(); . Elena realized she didn't need the GUI
But Elena knew the truth: she hadn't "converted JNLP to PDF." She had reverse-engineered a zombie. The JNLP was still dead. But its brain—the transformation logic, the JARs, the XSLT—was now puppeted by modern code. She closed her laptop at 11:47 PM
Now the challenge: she needed to "convert JNLP to PDF" in a way that was automated, serverless, and modern. She couldn't run the JNLP anymore. But she could extract its soul.
She wrote a Python script. Not because Python was the best tool, but because it was the most forgiving. She used subprocess to call a small Java CLI tool she wrote in twenty minutes. That Java tool did only one thing: loaded the old JARs (including iText 2.1.7 and the Xerces XML parser) into a custom classloader, instantiated the PDFBuilder class via reflection, and exposed a simple method: byte[] generatePdf(String xmlData) .