在 Java 11+ 中,我们可以以某种方式在不编译多个文件的情况下执行吗?

问题描述 投票:0回答:1

我正在研究无需任何编译的 Java 单源文件执行。所以我创建了这个文件,它运行得很好:

import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.List;


public class J11SingleSource {
    public static void main(String[] args) {
        // Creating a list of hobbies
        List<String> hobbies = new ArrayList<>();
        hobbies.add("Reading");
        hobbies.add("Swimming");
        hobbies.add("Gardening");

        // Creating a Person object
        Person person = new Person("John", 30, hobbies);

        // Serialize the Person object to JSON
        Gson gson = new Gson();
        String json = gson.toJson(person);
        System.out.println("Serialized JSON: " + json);

        // Deserialize JSON to a Person object
        Person deserializedPerson = gson.fromJson(json, Person.class);
        System.out.println("Deserialized Person: " + deserializedPerson.getName());
        System.out.println("Deserialized Person's Age: " + deserializedPerson.getAge());
        System.out.println("Deserialized Person's Hobbies: " + deserializedPerson.getHobbies());
    }
    
    

    static class Person {
        private String name;
        private int age;
        private List<String> hobbies;

        // Constructor, getters, and setters
        public Person(String name, int age, List<String> hobbies) {
            this.name = name;
            this.age = age;
            this.hobbies = hobbies;
        }

        // Getters and setters
        ...
    }

    
}

我是这样运行的:

java -cp lib/gson-2.8.8.jar J11SingleSource.java

它给了我预期的输出:

Serialized JSON: {"name":"John","age":30,"hobbies":["Reading","Swimming","Gardening"]}
Deserialized Person: John
Deserialized Person's Age: 30
Deserialized Person's Hobbies: [Reading, Swimming, Gardening]

但我想再多一点。所以我把它们分成文件:

首先我提取了

Person
类:

package tem.meaw.mua;

import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.List;


public class Person {
        private String name;
        private int age;
        private List<String> hobbies;

        // Constructor, getters, and setters
        public Person(String name, int age, List<String> hobbies) {
            this.name = name;
            this.age = age;
            this.hobbies = hobbies;
        }

        // Getters and setters
        ...
 }

以及包含主类的文件:

package tem.meaw.mua;

import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.List;

import tem.meaw.mua.Person;

public class Tem {
    public static void main(String[] args) {
        // Creating a list of hobbies
        List<String> hobbies = new ArrayList<>();
        hobbies.add("Reading");
        hobbies.add("Swimming");
        hobbies.add("Gardening");

        // Creating a Person object
        Person person = new Person("John", 30, hobbies);

        // Serialize the Person object to JSON
        Gson gson = new Gson();
        String json = gson.toJson(person);
        System.out.println("Serialized JSON: " + json);

        // Deserialize JSON to a Person object
        Person deserializedPerson = gson.fromJson(json, Person.class);
        System.out.println("Deserialized Person: " + deserializedPerson.getName());
        System.out.println("Deserialized Person's Age: " + deserializedPerson.getAge());
        System.out.println("Deserialized Person's Hobbies: " + deserializedPerson.getHobbies());
    }
}

我尝试像这样运行它:

java -cp lib/gson-2.8.8.jar Tem.java Person.java
但它告诉我:

Tem.java:7: error: cannot find symbol
import tem.meaw.mua.Person;
                   ^
  symbol:   class Person
  location: package tem.meaw.mua
Tem.java:18: error: cannot find symbol
        Person person = new Person("John", 30, hobbies);
...

那么在 Java 11+ 中,我们可以以某种方式将依赖文件一起运行到一个文件中而不需要编译吗?

java java-11 single-source
1个回答
0
投票

Java 22 版本首次添加了无需编译即可运行由多个源文件组成的程序的功能。

请参阅JEP 458:启动多文件源代码程序使用源文件模式启动源代码程序

以前版本的 Java(如 Java 11)仅支持单个文件:JEP 330:启动单文件源代码程序

© www.soinside.com 2019 - 2024. All rights reserved.