微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过java 6环境编译java 7项目 1.升级2.编译源以定位 1.83.一些字节码魔术

如何解决如何通过java 6环境编译java 7项目 1.升级2.编译源以定位 1.83.一些字节码魔术

我正在尝试制作一个用于处理网络摄像头的 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("串行") 公共类 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 十六进制)。

Source: Wikipedia

错误信息分析

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

  1. 有编译为目标 1.7 的类(jar)
  2. 与小于 1.7 的 JRE 一起使用时,将导致 51.0 error

一些猜测

假设您使用的是从这个 repo github:sarxos 生成的 jars(同样基于错误消息),

  1. 此存储库已编译为目标 1.7
  2. 作者可能使用了 1.7 种语言功能
  3. 作者可能希望他的 jar 的用户能够在 1.7 及更高版本上运行

选项

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

  1. 将您的运行时升级到至少 1.7
  2. 编译所有源(包括目标为 1.6 的可传递 jar 的源) - 假设我们可以访问源
  3. 尝试使用some retro byte code modifier utility

1.升级

如果可以选择升级,那么请升级到 1.7(推荐到 1.8 甚至 11)作为目标 1.6 编译所有依赖源比升级到 {{ 1}}(或更高版本)用于企业应用。

2.编译源以定位 1.8

如果无法升级,那么如果使用这个外部jar,那么

  1. fork repo(or checkout)*(请检查作者的许可),
  2. 将分叉的存储库编译为目标 1.6
  3. 在应用程序中包含这个 jar 并编译应用程序以定位 1.6
  4. 将此完全 1.6 目标编译的 jar 部署到 1.6 运行时

3.一些字节码魔术

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

,

嗯,该库要求您在 JDK 1.6 或 1.6 版中编译类

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

javac -源 1.6 -目标 1.6

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。