原理

python中,通过shell命令 commands.getoutput() 调用java

运行jar常见错误

linux运行

1
2
java -cp hello.jar hello
java -cp dependencies.jar com.bj.spat.hello

产生错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Exception in thread "main" java.lang.UnsupportedClassVersionError: hello : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

原因是由较高版本的JDK编译的java class文件试图在较低版本的JVM上运行产生的错误。

1、解决措施就是保证jvm(java命令)和jdk(javac命令)版本一致。如果是linux版本,则在命令行中分别输入java -version和javac-version命令来查看版本是否一致。这里假设都是1.7版本。

2、如果都一致,但还是解决不了问题,那么你肯定不是直接在命令行中用javac来编译的,而是用类似于eclipse、netbeans这样的编译器来编译的。因为很多编译器都自带javac,而不是采用操作系统中的编译器。如果你的编译器是eclipse的话,那么需要在项目的属性里设置jdk版本,方法是右击项目–>properties–>java compiler –> Enable project specific settings –>将compiler compliance level设置为1.7,也就是与jvm一致的版本(在命令行中java -version所显示的版本)。

综上,如果你是用编译器来编译的话,请首先确保编译器自带的jdk版本是否和操作系统中的java版本一致。

给jar传参数

1
java -cp hello.jar hello "参数"
1
2
3
4
5
6
7
8
9
public class hello {
public static void main(String []args) {
System.out.println(args.length);
for(int i=0;i<args.length;i++)
{
System.out.println(args[i]);
}
}
}
1
java -cp hello.jar hello 123456

输出
1
123456

python代码

1
2
3
4
5
6
7
8
import commands
import json

if __name__ == "__main__":
id = str(123)
command = "java -cp hello.jar hello " + id
line = str(commands.getoutput(command))
print line

运行python
输出
1
123456

maven依赖包打jar包

1、maven pom中添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<!-- <version>2.1</version> -->
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>

maven build输入命令:

1
assembly::assembly


1
2
mvn build: 把工程依赖包打到lib路径下
dependency:copy-dependencies -DoutputDirectory=lib