Jar에서 내부 Yaml을 처리하는 방법.
소개
얼마전 이전 포스트에서 '프로그래밍 방식으로 Java에서 YAML로 구성 파일을 관리하는 방법'을 소개한 적이 있습니다.
당신이 그것을 알고 싶다면 링크를 따르십시오:
Java Bean 객체를 생성하기 위해 Yaml 파일 내용을 전달하는 것이었습니다. 그것은 구성 또는 직렬화된 Valued-Object(VO)의 정보를 포함하고 있었습니다. 간단히 말해서 Yaml 파일과 Java 객체 사이의 로드 또는 덤프 정보였습니다.
한편, 예리한 생각을 가진 사람이 내부 리소스에서 Yaml 파일에 액세스하는 방법을 물었습니다.
그래서 필요성을 깨달았고,
여기서는 Jar에서 Yaml 파일을 로드하고 덤프하는 방법을 보여줍니다.
환경 설정.
자바 클래스 설계.
구현된 코드를 보기 전에 작업의 전체 디자인을 보여드리겠습니다.
코드에 대해 알아보겠습니다.
Jar에 있는 Yaml 파일의 내용은 아래에 있습니다.
firstName: Kooin
lastName: Shin
age: 48
profile:
- character: bright
hobby: claiming
address: Seoul
postalCode: 123
- character: delight
hobby: ski
address: Seoul
postalCode: 123
컨텐츠를 로드할 Java Bean은 Yaml의 값을 나타내는 'Customer'와 'Profile'입니다.
package org.chaostocosmos.doc.yml;
import java.util.List;
public class Customer {
private String firstName;
private String lastName;
private int age;
private List<Profile> 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<Profile> getProfile() {
return this.profile;
}
public void setProfile(List<Profile> 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<? extends Object> 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);
}
}
결론
위의 코드는 Jar에서 Yaml에 액세스하는 매우 간단한 경우를 가정합니다. 상황에 따라 변형, 수정 및 개선될 수 있습니다.
언제나 탄력적인 사고는 당신의 것!!!
행운을 빕니다!!!
Reference
이 문제에 관하여(Jar에서 내부 Yaml을 처리하는 방법.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kooin/how-to-handling-internal-yaml-in-jar-261n텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)