Рубрики
Без рубрики

Как обрабатывать внутренний Yaml в Jar.

Вступление. Некоторое время назад я рассказывал о том, как управлять вашим файлом конфигурации с помощью… Помеченный java, yaml, jar, внутренний.

Вступление.

Некоторое время назад я представлял “Как программно управлять файлом конфигурации с помощью YAML на Java” в предыдущем посте. если ты хочешь это знать, перейдите по ссылке: Как программно управлять файлом конфигурации с помощью YAML на Java

Речь шла о передаче содержимого файла Yaml для создания объекта Java Bean. Это включало информацию о конфигурации или сериализованном Ценном объекте (VO). Проще говоря, речь шла о загрузке или сбросе информации между файлом Yaml и объектом Java.

Между тем, кто-то, у кого есть острое мышление, спросил, как получить доступ к файлу Yaml во внутренних ресурсах? Поэтому я понял, что это необходимо, Здесь я хотел бы показать, как загрузить и выгрузить файл Yaml в Jar.

Настройка среды.

  1. Как и в предыдущем посте, для обработки файла Yaml нам нужна библиотека SnakeYaml.
  2. Для наших работ можно использовать любые инструменты IDE, но в наши дни я собираюсь использовать код Visual Studio (VSCODE) в fever.
  3. И мы должны установить зависимость SnakeYaml MAVEN на POM.xml . В предыдущем посте я использовал Gradle, но теперь использовал бы MAVEN для разнообразия:)
  4. Если вы готовы к вышеперечисленным вещам, будьте готовы начать кодирование.

Проектирование класса Java.

Прежде чем мы увидим реализованный код, я бы показал вам весь дизайн наших работ.

  1. Мы определим класс java с именем “Yaml InternalHandler” для обработки файла Yaml в Jar.
  2. Определит два метода с именами “загрузить внутреннюю банку” и “сбросить внутреннюю банку”. Первый – загрузить содержимое Yaml в объект Java с путем входа в jar и объектом класса, в который будет загружено содержимое. Второй – сбросить значения объекта в файл Yaml в Jar с путем входа в jar и экземпляром объекта Java, включающим значения.
  3. Мы могли бы загрузить и сбросить указанное сопоставление объектов с помощью файла Yaml в jar. Конечно, хорошо бы убедиться в синтаксисе файла Yaml в Jar.

Давайте погрузимся в код.

Содержимое файла Yaml в Jar находится ниже.

firstName: Kooin
lastName: Shin
age: 48
profile:
  - character: bright
    hobby: claiming
    address: Seoul
    postalCode: 123
  - character: delight
    hobby: ski
    address: Seoul
    postalCode: 123

Содержимое загружаемого Java-компонента – это “Клиент” и “Профиль”, представляющие ценности Yami.

package org.chaostocosmos.doc.yml;

import java.util.List;

public class Customer {

    private String firstName;
    private String lastName;
    private int age;
    private List profile;

    public Customer() {}

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return this.age;
    }

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

    public List getProfile() {
        return this.profile;
    }

    public void setProfile(List profile) {
        this.profile = profile;
    }

    @Override
    public String toString() {
        return "{" +
            " firstName='" + firstName + "'" +
            ", lastName='" + lastName + "'" +
            ", age='" + age + "'" +
            ", profile='" + profile + "'" +
            "}";
    }
}
package org.chaostocosmos.doc.yml;

public class Profile {

    String character;
    String hobby;
    String address;
    int postalCode;    

    public Profile() {}

    public String getCharacter() {
        return this.character;
    }

    public void setCharacter(String character) {
        this.character = character;
    }

    public String getHobby() {
        return this.hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    public String getAddress() {
        return this.address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public int getPostalCode() {
        return this.postalCode;
    }

    public void setPostalCode(int postalCode) {
        this.postalCode = postalCode;
    }

    @Override
    public String toString() {
        return "{" +
            " character='" + character + "'" +
            ", hobby='" + hobby + "'" +
            ", address='" + address + "'" +
            ", postalCode='" + postalCode + "'" +
            "}";
    }    
}

А теперь мы покажем основной код класса YamlInternalHandler.

package org.chaostocosmos.doc.yml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;
import java.util.zip.ZipEntry;

import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.DumperOptions.FlowStyle;
import org.yaml.snakeyaml.constructor.Constructor;

/**
 * Yaml Internal Handler 
 * 
 * @author Kooin-Shin
 * @since 2021.01.04
 */
public class YamlInternalHandler {

    /**
     * Jar file having yaml file
     */
    File file;

    /**
     * Constructor
     * @param file
     * @throws IOException
     */
    public YamlInternalHandler(File file) throws IOException {
        this.file = file;
    }

    /**
     * Load object from internal yaml file in jar
     * @param jarEntry
     * @param clazz
     * @return
     * @throws IOException
     */
    public Object loadInternalJar(String jarEntry, Class clazz) throws IOException {
        if (!jarEntry.endsWith(".yml")) {
            throw new IllegalArgumentException("This component only support a yaml file in jar!!!");
        }
        JarFile jarFile = new JarFile(this.file);   //Create JarFile object
        JarEntry entry = jarFile.getJarEntry(jarEntry);  //Get JarEntry specified by first parameter
        InputStream is = jarFile.getInputStream(entry);  //Get InputStream from JarFile  by JarEntry
        Constructor constructor = new Constructor(clazz); //Create Constructor object specified by second parameter
        Yaml yaml = new Yaml(constructor);  //Create Yaml object with Constructor object
        Object obj = yaml.load(is);   //Load contents to object instance
        is.close();  //Close InputStream
        jarFile.close();  //Close JarFile
        return obj;
    }

    /**
     * Dump object to yaml file in jar
     * @param jarEntry
     * @param obj
     * @throws FileNotFoundException
     * @throws IOException
     */
    public void dumpInternalJar(String jarEntry, Object obj) throws FileNotFoundException, IOException {
        JarOutputStream jos = new JarOutputStream(new FileOutputStream(this.file));  //Create JarOutputStream object 
        jos.putNextEntry(new ZipEntry(jarEntry));  //Put jar entry by first parameter
        DumperOptions options = new DumperOptions();  //Set dump options
        options.setDefaultFlowStyle(FlowStyle.BLOCK); 
        options.setPrettyFlow(true);
        Yaml yaml = new Yaml(options);  //Create Yaml object with DumperOptions object
        yaml.dump(obj, new OutputStreamWriter(jos));  //Dump contents of second parameter
        jos.close(); // Close JarOutputStream
    }

    public static void main(String[] args) throws IOException {
        File file = new File("D:\\Projects\\chaos-commons\\yaml.jar");
        YamlInternalHandler ymlHandler = new YamlInternalHandler(file);
        Customer customer = (Customer) ymlHandler.loadInternalJar("tmp/yaml/Customer.yml", Customer.class);
        System.out.println(customer.toString());
        customer.setFirstName("Jim ");
        customer.getProfile().get(0).setAddress("Busan");
        ymlHandler.dumpInternalJar("tmp/yaml/Customer.yml", customer);
    }
}

Вывод

Приведенный выше код предполагает очень простые случаи доступа к Yaml в Jar. Как ситуация, Она может быть преобразована, изменена и улучшена. Всегда эластичное мышление – ваше!!! удачи!!!

Оригинал: “https://dev.to/kooin/how-to-handling-internal-yaml-in-jar-261n”