如何在java 6环境下编译java 7项目



我正试图为处理网络摄像头制作一个jar文件。我必须把这个罐子用在另一个应用上。但是这个应用程序是由java 1.6制作的,所以我必须将这个jar转换为1.6。这段代码适用于Java 8。当我试图用java 1.6编译它时,它给出了这个错误

Updating property file: F:Core JavaCamerabuildbuilt-jar.properties
Compiling 1 source file to F:Core JavaCamerabuildclasses
compile-single:
run-single:
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/github/sarxos/webcam/WebcamPanel : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at ati.com.camera.CaptureImageMP.main(CaptureImageMP.java:53)
Java Result: 1

请告诉我如何用java 1.6运行这个项目

这是捕获图像的代码

公共类CaptureImageMP扩展VBean {

private IHandler mHandler;
private Main formsMain;
protected static final ID VN_NO = ID.registerProperty("VN_NO");
@Override
public void init(IHandler handler) {
mHandler = handler;
super.init(handler);
formsMain = (Main) mHandler.getApplet();
}
@Override
public boolean setProperty(ID _ID, Object _args) {
System.out.println("Method Called");
if (_ID == VN_NO) {
System.out.println("Got VN No" + VN_NO);
System.out.println("Got _ID No" + _ID);
if (_args != null) {
System.out.println("Got parameter :" + _args);
try {
new TakeSnapshotFromVideoExample();
} catch (Exception ex) {
System.out.println("Exception: " + ex);
return false;
}
}
return true;
}
//return true;
return super.setProperty(_ID, _args);
}
public static void main(String[] args) throws InterruptedException {
new TakeSnapshotFromVideoExample();
//  Thread.sleep(1000);
//  new Game1();
}

这是用于捕获图像和开/关相机UI的代码

@SuppressWarnings("serial"公共类TakeSnapshotFromVideoExample扩展JFrame {

private class SnapMeAction extends AbstractAction {
public SnapMeAction() {

super("Snapshot");
}
@Override
public void actionPerformed(ActionEvent e) {
//    int unique_id= (int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE); 
int unique_id= (int) (Integer.MAX_VALUE); 
try {
for (int i = 0; i < webcams.size(); i++) {
Webcam webcam = webcams.get(i);
//File file = new File(String.format("Image\"+unique_id+".jpg", i));
File file = new File(String.format("F:\Core Java\camera\ATILimitedRegImage\"+unique_id+".jpg", i));
ImageIO.write(webcam.getImage(), "JPG", file);
System.out.format("Image for %s saved in %s n", webcam.getName(), file);
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
private class StartAction extends AbstractAction implements Runnable {
public StartAction() {
super("Start");
}
@Override
public void actionPerformed(ActionEvent e) {
btStart.setEnabled(false);
btSnapMe.setEnabled(true);
// remember to start panel asynchronously - otherwise GUI will be
// blocked while OS is opening webcam HW (will have to wait for
// webcam to be ready) and this causes GUI to hang, stop responding
// and repainting
executor.execute(this);
}
@Override
public void run() {
btStop.setEnabled(true);
for (WebcamPanel panel : panels) {
panel.start();
}
}
}
private class StopAction extends AbstractAction {
public StopAction() {
super("Stop");
}
@Override
public void actionPerformed(ActionEvent e) {
btStart.setEnabled(true);
btSnapMe.setEnabled(false);
btStop.setEnabled(false);
for (WebcamPanel panel : panels) {
panel.stop();
}
}
}
private Executor executor = Executors.newSingleThreadExecutor();
//private Dimension size = WebcamResolution.QQVGA.getSize();
private Dimension size = WebcamResolution.VGA.getSize();
private List<Webcam> webcams = Webcam.getWebcams();
private List<WebcamPanel> panels = new ArrayList<WebcamPanel>();
private JButton btSnapMe = new JButton(new SnapMeAction());
private JButton btStart = new JButton(new StartAction());
private JButton btStop = new JButton(new StopAction());
public TakeSnapshotFromVideoExample() {
super("Test Snap Different Size");
for (Webcam webcam : webcams) {
webcam.setViewSize(size);
WebcamPanel panel = new WebcamPanel(webcam, size, false);
//panel.setFPSDisplayed(true);
panel.setFillArea(true);
panels.add(panel);
}
// start application with disable snapshot button - we enable it when
// webcam is started
btSnapMe.setEnabled(false);
btStop.setEnabled(false);
setLayout(new FlowLayout());
for (WebcamPanel panel : panels) {
add(panel);
}
add(btSnapMe);
add(btStart);
add(btStop);
pack();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TakeSnapshotFromVideoExample();
}

注意:我正在使用Netbeans IDE

使用的类文件格式的主要版本号。

Java SE 17 = 61 (0x3D十六进制),

Java SE 16 = 60 (0x3C十六进制),

Java SE 15 = 59 (0x3B十六进制),

Java SE 14 = 58 (0x3A十六进制),

Java SE 13 = 57 (0x39十六进制),

Java SE 12 = 56 (0x38十六进制),

Java SE 11 = 55 (0x37十六进制),

Java SE 10 = 54 (0x36十六进制),

Java SE 9 = 53 (0x35十六进制),

Java SE 8 = 52 (0x34十六进制),

Java SE 7 = 51 (0x33十六进制),

Java SE 6.0 = 50 (0x32十六进制),

Java SE 5.0 = 49 (0x31十六进制),

JDK 1.4 = 48 (0x30十六进制),

JDK 1.3 = 47 (0x2F十六进制),

JDK 1.2 = 46 (0x2E十六进制),

JDK 1.1 = 45 (0x2D十六进制).

来源:维基百科

错误信息分析

根据错误信息com/github/sarxos/webcam/WebcamPanel : Unsupported major.minor version 51.0

  1. 有类(jar)编译到目标1.7
  2. 在JRE低于1.7的环境下使用时,将导致51.0 error

一些猜测

假设您正在使用从这个repo github:sarxos生成的jar文件(同样基于错误消息),

  1. 这个repo被编译到目标1.7
  2. 作者可能使用了1.7语言特性
  3. 作者可能希望他的jar的用户运行在1.7及以上

选项如果到目前为止假设是正确的,那么可能的选项是

  1. 将运行时升级到至少1.7
  2. 编译所有的源文件(包括目标为1.6的可传递jar文件的源文件)——假设我们可以访问源文件
  3. 尝试使用一些复古的字节码修改器实用程序

1。升级

如果升级是一个选项,那么请升级到1.7(建议升级到1.8甚至11),因为对于企业应用程序,编译所有依赖源的目标1.6比升级到1.8(或更高版本)需要更多的努力。

2。编译源码到目标1.6

如果无法升级,则使用外部jar,则

  1. fork repo(或checkout)*(请检查作者的许可),
  2. 编译分叉的repo到目标1.6
  3. 在应用程序中包含这个jar并编译该应用程序到目标1.6
  4. 将这个完整的1.6目标编译jar部署到1.6运行时

3。一些字节码魔法

我的知识很有限,不能提出任何具体的建议。你可以签出这个repo

这个库要求你在JDK 1.6或1.6版本中编译这些类

在编译时,使用源代码和目标版本如下所示。让我知道它是否有效。

javac -source 1.6 -target 1.6

最新更新