原理

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

运行jar常见错误

linux运行

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

产生错误

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传参数

java -cp hello.jar hello "参数"
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]);
         }
    }
}
java -cp hello.jar hello 123456

输出
1
123456

python代码

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中添加:

  <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输入命令:

assembly::assembly

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