0

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

Updating property file: F:\Core Java\Camera\build\built-jar.properties
Compiling 1 source file to F:\Core Java\Camera\build\classes
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

4

2 回答 2

1

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

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. 有编译为目标 1.7 的类(罐子)
  2. 与小于 1.7 的 JRE 一起使用时,将导致51.0 error

一些猜测

假设您正在使用从此 repo github:sarxos生成的 jars (再次基于错误消息),

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

选项

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

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

1.升级

如果升级是一个选项,那么请升级到1.7(推荐到 1.8 甚至 11),因为所有依赖源的目标编译比升级到(或更高)企业应用程序1.6所需的工作量太大。1.8

2. 编译源到目标1.6

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

  1. 分叉回购(或结帐) *(请检查此作者的许可),
  2. 将分叉的 repo 编译为目标1.6
  3. 将此 jar 包含在应用程序中并将应用程序编译为目标1.6
  4. 1.6将此完全目标编译的 jar部署到 1.6 运行时

3. 一些字节码魔法

我的知识非常有限,无法提出任何具体的建议。你可以签出这个 repo

于 2021-01-29T04:56:18.050 回答
-1

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

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

javac -source 1.6 -target 1.6

于 2021-01-19T11:25:03.673 回答