vscode编译JAXB示例出错


1. 背景

使用环境:

vscode 1.63

jdk 17

os: CentOS Linux release 8.4.2105

maven:Apache Maven 3.8.2

项目要使用JAXB,因此在之前创建的项目中,粘贴了一些代码进行学习和测试

项目的pom.xml引入jar包

     
    
      com.sun.xml.bind
      jaxb-core
      2.2.11
    
    
    
      javax.xml
      jaxb-api
      2.1
    
    
    
      com.sun.xml.bind
      jaxb-impl
      2.2.11
    

src/main/java/com/liwl/dev/创建LiwanLiangJAXB.java

代码如下:

package com.liwl.dev;

//import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class LiwanLiangJAXB {

   String name;
   int age; 
   int id;

   public String getName() {
       return name;
   }

   @XmlElement
   public void setName(String name) {
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   @XmlElement
   public void setAge(int age) {
       this.age = age;
   }

   public int getId() {
       return id;
   }

   @XmlElement
   public void setId(int id) {
       this.id = id;
   }

   @Override
   public String toString(){
       return "LiwanLiangJAXB [name=" + name + ",age=" + age + ",id=" + id + "]";
   }
};

src/test/java/com/liwl/dev/目录的MyTest.java添加代码

package com.liwl.dev;

import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

public class MyTest {
    public static void main(String[] args) {
        LiwanLiangJAXB liwljaxb = new LiwanLiangJAXB();
        liwljaxb.setName("liwanliang");
        liwljaxb.setAge(30);
        liwljaxb.setId(100);
        try {
            File file = new File("/tmp/file.xml");
            JAXBContext jaxbContext = JAXBContext.newInstance(LiwanLiangJAXB.class);
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
            jaxbMarshaller.marshal(liwljaxb, file);
            jaxbMarshaller.marshal(liwljaxb, System.out);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}

编码完成,F5运行过程报错:

经过同事提示,要我检索:

module java.base dose not "open java.lang" to unnamed module @xxx

我找到一篇类似出错的博客:

看到解决方案是,添加:--add-opens java.base/java.lang=ALL-UNNAMED选项

在vscode配置如下:

然后重新F5,就出现正确的结果


总结:检索信息很重要