Можем ли мы в Java 11+ как-то выполнить без компиляции несколько файлов?

Я изучал выполнение файла с одним исходным кодом 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 22+, см. JEP 458: Запуск многофайловых программ с исходным кодом.

Slaw 10.05.2024 08:06

Кстати, «запускать... без компиляции» - НЕТ, вы не можете запускать файлы Java без компиляции. Код все еще компилируется (в память), даже если используется «Режим исходного файла для запуска программ с исходным кодом из одного файла».

user85421 10.05.2024 10:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возможность запуска программы, состоящей из нескольких исходных файлов, без ее предварительной компиляции, была впервые добавлена ​​в Java в версии 22.

См. JEP 458: Запуск многофайловых программ с исходным кодом и Использование режима исходного кода для запуска программ с исходным кодом.

Предыдущие версии Java (например, Java 11) поддерживают только один файл: JEP 330: запуск однофайловых программ с исходным кодом.

Другие вопросы по теме