The best current techniques for distributing your Python files in a jar are detailed in this article on Jython's wiki: http://wiki.python.org/jython/JythonFaq/DistributingJythonScripts

For your case, I think you would want to take the jython.jar file that you get when you install Jython and zip the Jython Lib directory into it, then zip your .py files in, and then add a __run__.py file with your startup logic (this file is treated specially by Jython and will be the file executed when you call the jar with "java -jar").

This process is definitely more complicated then in ought to be, and so we (the Jython developers) need to come up with a nice tool that will automate these tasks, but for now these are the best methods. Below I'm copying the recipe at the bottom of the above article (modified slightly to fit your problem description) to give you a sense of the solution.

Create the basic jar:

JYTHON_HOME
$ cp jython.jar jythonlib.jar
$ zip -r jythonlib.jar Lib

Add other modules to the jar:

MY_APP_DIRECTORY
JYTHON_HOME/jythonlib.jar myapp.jar
$ zip myapp.jar Lib/showobjs.py
# Add path to additional jar file.
$ jar ufm myapp.jar othermanifest.mf

Add the __run__.py module:

# Copy or rename your start-up script, removing the "__name__  == '__main__'" check.
$ cp mymainscript.py __run__.py
# Add your start-up script (__run__.py) to the jar.
$ zip myapp.jar __run__.py
# Add path to main jar to the CLASSPATH environment variable.
$ export CLASSPATH=/path/to/my/app/myapp.jar:$CLASSPATH

On MS Windows, that last line, setting the CLASSPATH environment variable, would look something like this:

set CLASSPATH=C:\path\to\my\app\myapp.jar;%CLASSPATH%

Or, again on MS Windows, use the Control Panel and the System properties to set the CLASSPATH environment variable.

Run the application:

$ java -jar myapp.jar mymainscript.py arg1 arg2

Or, if you have added your start-up script to the jar, use one of the following:

$ java org.python.util.jython -jar myapp.jar arg1 arg2
$ java -cp myapp.jar org.python.util.jython -jar myapp.jar arg1 arg2
$ java -jar myapp.jar -jar myapp.jar arg1 arg2

The double -jar is kind of annoying, so if you want to avoid that and get the more pleasing:

$ java -jar myapp.jar arg1

You'll have to do a bit more work until we get something like this into a future Jython [Update: JarRunner is part of Jython 2.5.1]. Here is some Java code that looks for the __run__.py automatically, and runs it. Note that this is my first try at this class. Let me know if it needs improvement!

package org.python.util;

import org.python.core.imp;
import org.python.core.PySystemState;

public class JarRunner {

    public static void run(String[] args) {
        final String runner = "__run__";
        String[] argv = new String[args.length + 1];
        argv[0] = runner;
        System.arraycopy(args, 0, argv, 1, args.length);
        PySystemState.initialize(PySystemState.getBaseProperties(), null, argv);
        imp.load(runner);
    }

    public static void main(String[] args) {
        run(args);
    }
}

I put this code into the org.python.util package, since that's where it would go if we decide to include it in a future Jython. To compile it, you'll need to put jython.jar (or your myapp.jar) into the classpath like:

$ javac -classpath myapp.jar org/python/util/JarRunner.java

Then you'll need to add JarRunner.class to your jar (the class file will need to be in org/python/util/JarRunner.class) calling jar on the "org" directory will get the whole path into your jar.

$ jar uf org

Add this to a file that you will use to update the manifest, a good name is manifest.txt:

Main-Class: org.python.util.JarRunner

Then update the jar's manifest:

$ jar ufm myapp.jar manifest.txt

Now you should be able to run your app like this:

$ java -jar myapp.jar
Answer from Frank Wierzbicki on Stack Overflow
Top answer
1 of 4
66

The best current techniques for distributing your Python files in a jar are detailed in this article on Jython's wiki: http://wiki.python.org/jython/JythonFaq/DistributingJythonScripts

For your case, I think you would want to take the jython.jar file that you get when you install Jython and zip the Jython Lib directory into it, then zip your .py files in, and then add a __run__.py file with your startup logic (this file is treated specially by Jython and will be the file executed when you call the jar with "java -jar").

This process is definitely more complicated then in ought to be, and so we (the Jython developers) need to come up with a nice tool that will automate these tasks, but for now these are the best methods. Below I'm copying the recipe at the bottom of the above article (modified slightly to fit your problem description) to give you a sense of the solution.

Create the basic jar:

JYTHON_HOME
$ cp jython.jar jythonlib.jar
$ zip -r jythonlib.jar Lib

Add other modules to the jar:

MY_APP_DIRECTORY
JYTHON_HOME/jythonlib.jar myapp.jar
$ zip myapp.jar Lib/showobjs.py
# Add path to additional jar file.
$ jar ufm myapp.jar othermanifest.mf

Add the __run__.py module:

# Copy or rename your start-up script, removing the "__name__  == '__main__'" check.
$ cp mymainscript.py __run__.py
# Add your start-up script (__run__.py) to the jar.
$ zip myapp.jar __run__.py
# Add path to main jar to the CLASSPATH environment variable.
$ export CLASSPATH=/path/to/my/app/myapp.jar:$CLASSPATH

On MS Windows, that last line, setting the CLASSPATH environment variable, would look something like this:

set CLASSPATH=C:\path\to\my\app\myapp.jar;%CLASSPATH%

Or, again on MS Windows, use the Control Panel and the System properties to set the CLASSPATH environment variable.

Run the application:

$ java -jar myapp.jar mymainscript.py arg1 arg2

Or, if you have added your start-up script to the jar, use one of the following:

$ java org.python.util.jython -jar myapp.jar arg1 arg2
$ java -cp myapp.jar org.python.util.jython -jar myapp.jar arg1 arg2
$ java -jar myapp.jar -jar myapp.jar arg1 arg2

The double -jar is kind of annoying, so if you want to avoid that and get the more pleasing:

$ java -jar myapp.jar arg1

You'll have to do a bit more work until we get something like this into a future Jython [Update: JarRunner is part of Jython 2.5.1]. Here is some Java code that looks for the __run__.py automatically, and runs it. Note that this is my first try at this class. Let me know if it needs improvement!

package org.python.util;

import org.python.core.imp;
import org.python.core.PySystemState;

public class JarRunner {

    public static void run(String[] args) {
        final String runner = "__run__";
        String[] argv = new String[args.length + 1];
        argv[0] = runner;
        System.arraycopy(args, 0, argv, 1, args.length);
        PySystemState.initialize(PySystemState.getBaseProperties(), null, argv);
        imp.load(runner);
    }

    public static void main(String[] args) {
        run(args);
    }
}

I put this code into the org.python.util package, since that's where it would go if we decide to include it in a future Jython. To compile it, you'll need to put jython.jar (or your myapp.jar) into the classpath like:

$ javac -classpath myapp.jar org/python/util/JarRunner.java

Then you'll need to add JarRunner.class to your jar (the class file will need to be in org/python/util/JarRunner.class) calling jar on the "org" directory will get the whole path into your jar.

$ jar uf org

Add this to a file that you will use to update the manifest, a good name is manifest.txt:

Main-Class: org.python.util.JarRunner

Then update the jar's manifest:

$ jar ufm myapp.jar manifest.txt

Now you should be able to run your app like this:

$ java -jar myapp.jar
2 of 4
2

I experienced a similar issue in that I want to be able to create simple command line calls for my jython apps, not require that the user go through the jython installation process, and be able to have the jython scripts append library dependencies at runtime to sys.path so as to include core java code.

# append Java library elements to path
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..", "lib", "poi-3.8-20120326.jar"))

When running the 'jython' launcher explicitly on the command line, on Unix systems, it just runs a big shell script to properly form a java command line call. This jython launcher seems to have a dependency on reaching back to a core install of jython, and by some way of magic allows the proper handling of .jar files being added to the sys.path at runtime from within my .py scripts. You can see what the call is and block execution by the following:

jython --print run_form.py
java -Xmx512m -Xss1024k -Dfile.encoding=UTF-8 -classpath /Applications/jython2.5.2/jython.jar: -Dpython.home=/Applications/jython2.5.2 -Dpython.executable=/Applications/jython2.5.2/bin/jython org.python.util.jython run_form.py

But it's still just firing up a JVM and running a class file. So my goal was to be able to make this java call to a standalone jython.jar present in my distribution's lib directory so users would not need to do any additional installation steps to start using my .py scripted utilities.

java -Xmx512m -Xss1024k -classpath ../../lib/jython.jar org.python.util.jython run_form.py

Trouble is that the behavior is enough different that I would get responses like this:

  File "run_form.py", line 14, in <module>
    import xls_mgr
  File "/Users/test/Eclipse/workspace/test_code/py/test/xls_mgr.py", line 17, in <module>
    import org.apache.poi.hssf.extractor as xls_extractor
ImportError: No module named apache

Now you might say that I should just add the jar files to the -classpath, which in fact I tried, but I would get the same result.

The suggestion of bundling all of your .class files in a jython.jar did not sound appealing to me at all. It would be a mess and would bind the Java/Python hybrid application too tightly to the jython distribution. So that idea was not going to fly. Finally, after lots of searching, I ran across bug #1776 at jython.org, which has been listed as critical for a year and a half, but I don't see that the latest updates to jython incorporate a fix. Still, if you're having problems with having jython include your separate jar files, you should read this.

http://bugs.jython.org/issue1776

In there, you will find the temporary workaround for this. In my case, I took the Apache POI jar file and unjar'ed it into its own separate lib directory and then modified the sys.path entry to point to the directory instead of the jar:

sys.path.append('/Users/test/Eclipse/workspace/test_code/lib/poi_lib')

Now, when I run jython by way of java, referencing my local jython.jar, the utility runs just peachy. Now I can create simple scripts or batch files to make a seamless command line experience for my .py utilities, which the user can run without any additional installation steps.

🌐
CodeConvert AI
codeconvert.ai › python-to-java-converter
Free Python to Java Converter — AI Code Translation | CodeConvert AI
Instantly convert Python to Java code with AI. Free, fast, and accurate code translation — 60+ languages supported, no signup required.
Discussions

What is the python equivalent to a Java .jar file? - Stack Overflow
Java has the concept of packaging all of the code into a file called a Jar file. Does Python have an equivalent idea? If so, what is it? How do I package the files? More on stackoverflow.com
🌐 stackoverflow.com
[Curiosity] Python's equivalent of Java's .jar-file
Do we have something similar to Java’s .jar-files in the standard library? E.g. a way to run Python code from some kind of compressed file without manually unpack it first? I’m asking out of curiosity, but also because it would open new possibility for Python programmers to distribute their ... More on discuss.python.org
🌐 discuss.python.org
8
1
May 15, 2024
how do i convert a .py file to a .jar file??
Pretty sure .jar files are exclusively for java lol More on reddit.com
🌐 r/Discord_Bots
8
0
January 3, 2022
how to compile a jar file from a py script?
how to compile a jar file from a py script More on github.com
🌐 github.com
9
July 27, 2022
People also ask

Is the Python to Java converter free?
Yes. You can convert Python to Java for free without creating an account for up to 5 conversions per day. For higher limits and additional features, you can sign up for a Pro account.
🌐
codeconvert.ai
codeconvert.ai › python-to-java-converter
Free Python to Java Converter — AI Code Translation | CodeConvert AI
Can I also convert Java back to Python?
Yes! CodeConvert AI supports bidirectional conversion. You can convert Java to Python just as easily by using our Java to Python converter.
🌐
codeconvert.ai
codeconvert.ai › python-to-java-converter
Free Python to Java Converter — AI Code Translation | CodeConvert AI
How do I convert Python to Java using CodeConvert AI?
Simply paste your Python code into the input box and click the Convert button. Our AI will analyze your Python code and produce equivalent Java code in seconds, preserving the original logic and structure.
🌐
codeconvert.ai
codeconvert.ai › python-to-java-converter
Free Python to Java Converter — AI Code Translation | CodeConvert AI
🌐
DaniWeb
daniweb.com › programming › software-development › threads › 355378 › is-there-something-like-a-jar-file
python - Is there something like a jar file? [SOLVED] | DaniWeb
March 24, 2011 - Is there any way to produce an executable file containing everything within it like Java's .jar's? ... If you want a single, double-clickable file that behaves like a JAR, Python’s built-in zipimport plus zipapp is the closest analogue.
Top answer
1 of 4
38

Python doesn't have any exact equivalent to a .jar file.

There are many differences, and without knowing exactly what you want to do, it's hard to explain how to do it. But the Python Packaging User Guide does a pretty good job of explaining just about everything relevant.

Here are some of the major differences.


A .jar file is a compiled collection of classes that can be dropped into your application, or installed anywhere on your CLASSPATH.

In Python:

  • A .py (or .pyc) module can be dropped into your application, or installed anywhere on your sys.path, and it can be imported and used.
  • A directory full of modules can be treated the same way; it becomes a package (or, if it doesn't contain an __init__.py, it merges with other directories of the same name elsewhere on sys.path into a single package).
  • A .zip archive containing any number of modules and packages can be stored anywhere, and its path added to your sys.path (e.g., at runtime or via PYTHONPATH) and all of its contents become importable.

Most commonly, you want things to be installed into a system, user, or virtualenv site-packages directory. The recommended way to do that is to create a pip-compatible package distribution; people then install it (and possibly automatically download it from PyPI or a private repo) via pip.

pip does a lot more than that, however. It also allows you to manage dependencies between packages. So ideally, instead of listing a bunch of prereqs that someone has to go download and install manually, you just make them dependencies, and someone just has to pip install your-library. And it keeps track of the state of your site-packages, so you can uninstall or upgrade a package without having to track down the specific files.


Meanwhile, in Java, most .jar files are cross-platform; build once, run anywhere. A few packages have JNI native code and can't be used this way, but it's not the norm.

In Python, many packages have C extensions that have to be compiled for each platform, and even pure-Python packages often need to do some install-time configuration. And meanwhile, "compiling" pure Python doesn't do anything that can't be done just as well at runtime. So in Python, you generally distribute source packages, not compiled packages.

However, .wheel is a binary package format. You can pip wheel to build binary packages for different targets from the source package; then, if someone tries to pip install your package, if there's a wheel for his system, that will be downloaded and installed.

2 of 4
7

Easy Install from setup_tools defines the .egg format for deploying Python libraries or applications. While similar to JAR, it is nowhere spread as universally as JARs in Java world. Many people just deploy the .py files.

A newer format, intended to supersede eggs, is wheel.

🌐
SSEC
ssec.wisc.edu › ~tomw › visadtutor › compile.html
Compiling your Python code with jythonc
Make a batch file (or script) in the VisAD-Jython install directory to invoke the jythonc compiler. You can use the batch files in the VisAD-Jython installation directory as guidance. My script (which I called comp.bat) looks like this: @echo off set JYTHON_PATH=. set CLASSPATH=. %JYTHON_PATH%\jre\bin\java.exe -mx256m "-Dpython.home=%JYTHON_PATH%\\" "-Dpython .path=%JYTHON_PATH%.\\" -cp "%JYTHON_PATH%\\jython.jar;%JYTHON_PATH%\\visad.jar; %JYTHON_PATH%\\;." org.python.util.jython "%JYTHON_PATH%\Tools\jythonc\jythonc.p y " --compiler javac %1 %2 %3 %4 %5 %6 %7 %8 %9 (Note the "--compiler javac" option -- this assumes that the Java compiler to use (javac) is in your PATH.)
🌐
Google Groups
groups.google.com › a › py4j.org › g › py4j › c › -m6h7DiiPzg
Python script to .jar file using Py4J
Although the title of the official ... description of the official site is also as follows. - 'Py4J enables Python programs running in a Python interpreter to dynamically access Java objects in a Java Virtual Machine.'...
Find elsewhere
🌐
Coderanch
coderanch.com › t › 600754 › languages › python-equivalent-Java-jar-file
What is the python equivalent to a Java .jar file? (Jython/Python forum at Coderanch)
December 19, 2012 - Haven't used these myself though. More on setuptools here, and some stuff about various approaches to packaging on the Python 3 docs. Maybe post the same question on StackOverflow as well? No more Blub for me, thank you, Vicar. ... Palak Mathur wrote:You may want to use py2exe.
🌐
Jython
jython.org › jython-old-sites › archive › 21 › docs › jythonc.html
Using the Jython compiler - jythonc
The previous section describes how Python classes can be created that subclass from Java classes. This works very well when you want to pass a Python class into Java from Jython. This is not adequate for building real Java ".class" files that implement a Java class and can be passed directly ...
🌐
Reddit
reddit.com › r/discord_bots › how do i convert a .py file to a .jar file??
r/Discord_Bots on Reddit: how do i convert a .py file to a .jar file??
January 3, 2022 -

hello i have been coding a minecraft mod with python but i do not know how to covert it into a .jar file if anyone can give me a tutorial that whould be nice Thank You

🌐
GitHub
github.com › luka-dev › jxe2jar
GitHub - luka-dev/jxe2jar: Python tool to convert IBM J9 JXE files to standard Java JAR format · GitHub
Python tool to convert IBM J9 JXE files to standard Java JAR format - luka-dev/jxe2jar
Author   luka-dev
🌐
Image.sc
forum.image.sc › development
Is it possible to convert Python Fiji script to .jar file? - Development - Image.sc Forum
May 2, 2024 - Hello everyone, I have written Fiji plugin in python. It works well when I put it to the “…>Plugins>Macros” file and I can see it in the Plugin-Macro menu. However, is it possible to convert it to .jar file? It seems to…
🌐
Convertio
convertio.co › jar-converter
JAR Converter — Convertio
Need to convert JAR file? Our online tool will help you with this! Easy to use, no registration and 100% secure to use. Convertio — advanced online tool that solving any problems with any files.
🌐
Quora
quora.com › What-is-the-best-way-to-convert-Python-to-Java-assuming-that-performance-speed-and-code-readability-are-not-an-issue
What is the best way to convert Python to Java, assuming that performance, speed, and code readability are not an issue? - Quora
Answer (1 of 12): The fastest I have seen is by using a Tokenizer I will explain. #A Python Script… Delimiters in Python are how it is compiled to and for C to execute. We do this all the time with Java also. Computer languages are very similar and use Tokenisers just as you can see here below ...
🌐
YouTube
youtube.com › watch
From Python to Java: Converting a Simple Program - YouTube
Enjoy the videos and music you love, upload original content, and share it all with friends, family, and the world on YouTube.
Published   January 18, 2018
🌐
Python Adventures
pythonadventures.wordpress.com › 2014 › 01 › 05 › python-equivalent-of-java-jar-files
Python equivalent of Java .jar files | Python Adventures
January 5, 2014 - Problem In Java, you can distribute your project in JAR format. It is essentially a ZIP file with some metadata. The project can be launched easily: $ java -jar project.jar What is its Python equiv…