저자: 마이클 카르네임
프로젝트 홈페이지: http://github.com/mkarneim/pojobuilder
PojoBuilder 생성기는 POJO(Plain Old Java Object)용 유창한 빌더 클래스를 생성하는 Java 6 호환 주석 프로세서입니다.
생성된 빌더는 다음을 제공합니다.
다음은 코드에서 생성된 pojo 빌더를 사용하는 방법에 대한 예입니다.
Contact james = new ContactBuilder ()
. withSurname ( "Bond" )
. withFirstname ( "James" )
. withEmail ( "[email protected]" )
. build ();
빌더는 예를 들어 관련 데이터 속성만 설정하려는 테스트 데이터를 구축하는 데 매우 유용합니다.
자세한 내용은
"src" 디렉터리에 있는 소스 코드는 PUBLIC DOMAIN에 있습니다. 자세한 내용은 COPYING 파일을 읽어보세요.
PojoBuilder는 순수 코드 생성기입니다. 프로젝트에 런타임 종속성을 추가하지 않습니다.
그러나 PojoBuilder는 자체 라이선스가 있는 프로젝트에 다음과 같은 컴파일 타임 종속성을 추가합니다.
PojoBuilder는 오픈 소스입니다. 소스 코드는 http://github.com/mkarneim/pojobuilder에서 사용할 수 있습니다. 이전 버전 및 변경 로그는 릴리스 기록 페이지를 참조하세요.
PojoBuilder 바이너리는 Sonatype OSS Maven Repository 및 Maven Central에서 다운로드할 수 있습니다.
Maven 저장소를 지원하는 빌드 자동화 도구를 사용하지 않는 경우 pojobuilder-4.3.0-jar-with-dependencies.jar
을 다운로드하여 모든 종속 라이브러리가 포함된 PojoBuilder를 완성할 수 있습니다.
PojoBuilder 생성기는 주석 프로세서를 사용하여 pojo 빌더를 생성합니다. 코드 생성을 트리거하는 옵션은 다음과 같습니다.
pojo에 대한 빌더 클래스를 생성하려면 해당 생성자 중 하나 에 @GeneratePojoBuilder
주석을 달 수 있습니다.
다음 예제 pojo를 살펴보겠습니다.
public class Contact {
private final String surname ;
private final String firstname ;
private String email ;
@ GeneratePojoBuilder
public Contact ( String surname , String firstname ) {
this . surname = surname ;
this . firstname = firstname ;
}
public String getEmail () {
return email ;
}
public void setEmail ( String email ) {
this . email = email ;
}
public String getSurname () {
return surname ;
}
public String getFirstname () {
return firstname ;
}
}
@GeneratePojoBuilder 주석은 주석 프로세서에게 ContactBuilder
라는 이름의 새 Java 소스 파일을 생성하라고 지시합니다. 생성된 소스 코드를 보려면 ContactBuilder.java
를 살펴보세요.
생성자는 공개 되어야 하거나 생성된 빌더에 대해 액세스 가능해야 합니다. 예를 들어 보호되는 경우 생성된 빌더는 동일한 패키지에 있어야 합니다.
또한 생성자 매개변수 이름은 pojo의 속성 이름과 정확히 일치해야 합니다.
선택적 @ConstructorProperties 주석을 사용하여 생성자 매개변수 이름에서 pojo의 해당 bean-property 이름으로의 매핑을 지정할 수 있습니다.
public class Contact {
private final String surname ;
private final String firstname ;
private String email ;
@ GeneratePojoBuilder
@ ConstructorProperties ({ "surname" , "firstname" })
public Contact ( String arg1 , String arg2 ) {
this . surname = arg1 ;
this . firstname = arg2 ;
}
public String getEmail () {
return email ;
}
public void setEmail ( String email ) {
this . email = email ;
}
public String getSurname () {
return surname ;
}
public String getFirstname () {
return firstname ;
}
}
pojo에 생성자(또는 공개 기본 생성자)가 없는 경우 해당 클래스 에 @GeneratePojoBuilder
주석을 달 수 있습니다.
다음 예제 pojo를 살펴보겠습니다.
@ GeneratePojoBuilder
public class User {
private String name ;
private char [] password ;
public String getName () {
return name ;
}
public void setName ( String name ) {
this . name = name ;
}
public char [] getPassword () {
return password ;
}
public void setPassword ( char [] password ) {
this . password = password ;
}
}
생성된 소스 코드를 보려면 UserBuilder.java
를 살펴보세요.
또는 pojo의 소스 코드에 액세스할 수 없거나 pojo 주석을 달기를 좋아하지 않는 경우 팩토리 메서드에 주석을 달 수 있습니다.
public class UrlFactory {
@ GeneratePojoBuilder ( withName = "UrlBuilder" , intoPackage = "samples" )
public static URL createUrl (
String protocol , String host , int port , String file , URLStreamHandler handler )
throws MalformedURLException {
return new URL ( protocol , host , port , file , handler );
}
}
생성된 소스 코드를 보려면 UrlBuilder.java
를 살펴보세요.
팩토리 메소드는 public 및 static 이어야 합니다. 메소드 매개변수 이름은 pojo의 속성 이름과 정확히 일치해야 합니다.
선택적 @FactoryProperties 주석을 사용하여 공장 메소드 매개변수 이름에서 pojo의 해당 bean 속성 이름으로의 매핑을 지정할 수 있습니다.
public class FileFactory {
@ GeneratePojoBuilder ( intoPackage = "samples" )
@ FactoryProperties ({ "path" })
public static File createFile ( String arg1 ) {
return new File ( arg1 );
}
}
생성된 소스 코드를 보려면 FileBuilder.java
를 살펴보세요.
PojoBuilder 4.3부터 Java 17 레코드 유형에 주석을 달 수 있습니다.
@ GeneratePojoBuilder
public record MyRecord ( int x , int y , String blah ) {}
@GeneratePojoBuilder의 다음 요소를 사용하여 코드 생성 프로세스의 출력을 구성할 수 있습니다.
Contact
인 경우 Fluent*Builder
패턴의 결과는 FluentContactBuilder
가 됩니다. 기본 패턴은 *Builder
입니다.Visibility.PUBLIC
입니다.com.example
인 경우 *.util
패턴의 결과는 com.example.util
이 됩니다. 기본 패턴은 *
입니다.Object.class
입니다.Address.java
, Builder.java
및 AddressBuilder.java
참조하세요. 기본값은 Void.class
입니다. 즉, 인터페이스를 구현해서는 안 됩니다.Recipient.java
, Builder.java
및 RecipientBuilder.java
참조하십시오. 기본값은 false
입니다.InputSourceFactory.java
및 InputSourceBuilder.java
참조하세요. 기본값은 *
입니다.CalendarFactory.java
및 GregorianCalendarBuilder.java
를 참조하세요. 기본값은 빈 배열입니다.Player.java
, PlayerBuilder.java
및 AbstractPlayerBuilder.java
참조하세요. 기본값은 false
입니다.TextEmail.java
및 TextEmailBuilder.java
참조하세요. 기본값은 false
입니다.com.google.common.base.Optional
및 java.util.Optional
이 있습니다. 기본값은 Void.class
입니다. 이는 선택 사항 기반 setter 메서드가 생성되지 않음을 의미합니다.with*
입니다.validate
메소드를 정의해야 합니다. 유효성 검사가 실패하면 메서드는 일부 런타임 예외(또는 해당 하위 클래스 중 하나)를 발생시켜야 합니다. 예를 보려면 Credentials.java
, CredentialsValidator.java
및 CredentialsBuilder.java
참조하세요.Task.java
및 TaskBuilder.java
참조하세요. 기본값은 이 메서드를 생성하지 않음을 의미하는 ""
입니다.버전 3부터 PojoBuilder는 메타 주석을 지원합니다. 즉, @GeneratePojoBuilder를 다른 주석에 배치하면 상속됩니다.
장점은 다음과 같습니다:
다음 예제에서는 클래스 수준에서 적용할 수 있고 세 가지 다른 소스(PojoBuilder, Lombok 및 JSR-305)의 주석을 캡슐화할 수 있는 @AppPojo
정의합니다.
@ GeneratePojoBuilder ( withName = "Fluent*Builder" )
@ lombok . experimental . Value // class-level annotation from Lombok
@ javax . annotation . concurrent . Immutable // class-level annotation from JSR-305
@ Target ({ ElementType . TYPE , ElementType . ANNOTATION_TYPE })
public @interface AppPojo {
}
이는 각 pojo에 배치할 수 있습니다.
@ AppPojo
public class Contact {
public String name ;
}
PojoBuilder는 @AppPojo
주석에서 상속된 지시어를 기반으로 FluentContactBuilder
생성합니다.
메타 주석에서 상속된 기본값은 더 많은 '로컬' @GeneratePojoBuilder
주석으로 재정의될 수 있습니다.
@ AppPojo
@ GeneratePojoBuilder ( intoPackage = "builder" )
public class Contact {
public String name ;
}
그러면 FluentContactBuilder
이전과 같이 생성되지만 패키지 builder
에는 생성됩니다.
PojoBuilder 위키는 PojoBuilder 생성기 사용(예: 자동화된 테스트를 위한 도메인별 언어 구축)에 대한 요리책을 제공합니다.
전체 코드 예제를 보려면 src/testdata/java/samples 폴더를 살펴보세요.
PojoBuilder 주석 프로세서를 실행하려면 컴파일 타임 클래스 경로에 넣기만 하면 됩니다. PojoBuilder 주석의 보존 정책은 CLASS
이므로 런타임 중에는 라이브러리가 필요하지 않습니다.
다음은 PojoBuilder를 실행하는 방법에 대한 간략한 설명 목록입니다.
javac
컴파일러는 pojobuilder-*.jar
이 클래스 경로에 포함된 경우 PojoBuilder의 존재를 자동으로 감지합니다.
예를 들어:
javac -cp pojobuilder-4.3.0-jar-with-dependencies.jar Contact.java
Contact
에 @GeneratePojoBuilder
주석이 추가되면 ContactBuilder
생성됩니다.
자세한 내용은 javac 설명서를 참조하세요.
PojoBuilder 주석 프로세서를 구성하려면 프로젝트의 pom.xml
에 다음을 추가하세요.
net.karneim
pojobuilder
4.3.0
provided
참고:
${project.build.directory}/generated-sources/annotations
에 나타납니다.target
디렉터리 외부의 특정 디렉터리에 보관해야 하는 경우 maven-compiler-plugin
의 generatedSourcesDirectory
를 구성하세요. 예제는 샘플 Maven pom을 참조하세요.이것은 Gradle로 PojoBuilder 주석 프로세서를 실행하는 방법을 보여주는 작은 빌드 스크립트입니다.
apply plugin : ' java '
repositories {
mavenCentral()
}
dependencies {
compile ' net.karneim:pojobuilder:4.3.0 '
}
이는 PojoBuilder와 해당 종속성을 컴파일 타임 클래스 경로뿐만 아니라 런타임 클래스 경로에도 추가한다는 점에 유의하세요.
또는 다음 스크립트를 사용하여 컴파일 타임 클래스 경로에만 PojoBuilder를 추가할 수 있습니다.
apply plugin : ' java '
repositories {
mavenCentral()
}
configurations {
codeGeneration
}
dependencies {
codeGeneration ' net.karneim:pojobuilder:4.3.0 '
compileOnly ' net.karneim:pojobuilder:4.3.0:annotations '
}
compileJava . classpath + = configurations . codeGeneration
compileTestJava . classpath + = configurations . codeGeneration
두 경우 모두 생성된 소스는 표준 build/classes
디렉토리에 배치됩니다.
다른 곳에 저장하려면 다음과 같이 대상을 지정하세요.
compileJava . options . compilerArgs + = [ ' -s ' , ' src/generated/java ' ]
Wiki에는 코드 생성과 컴파일 작업을 완전히 구별하는 확장된 Gradle 스크립트가 포함되어 있습니다.
Eclipse IDE용 PojoBuilder를 활성화하는 또 다른 Gradle 스크립트가 있습니다.
Gradle 5.0에서는 클래스 경로의 모든 주석 프로세서가 더 이상 실행되지 않습니다. pojobuilder가 다시 작동하도록 하려면 사용된 종속성 범위를 annotationProcessor
로 바꾸세요.
dependencies {
annotationProcessor ' net.karneim:pojobuilder:4.3.0 '
}
다음은 javac
작업 내에서 PojoBuilder 주석 프로세서를 실행하는 일부 샘플 ANT 빌드 스크립트의 코드 조각입니다.
< fileset id = " libs.fileset " dir = " ${basedir}/lib " >
< include name = " *.jar " />
fileset >
< path id = " class.path " >
< fileset refid = " libs.fileset " />
path >
< target name = " compile " depends = " init "
description = " Compile java sources and run annotation processor " >
< mkdir dir = " ${src.gen.java.dir} " />
< mkdir dir = " ${build.classes.dir} " />
< javac classpathref = " class.path " destdir = " ${build.classes.dir} " >
< src path = " ${src.main.java.dir} " />
< compilerarg line = " -s ${src.gen.java.dir} " />
javac >
target >
빌드 주기 동안 PojoBuilder 주석 프로세서를 실행하도록 Eclipse를 구성할 수도 있습니다. @GeneratePojoBuilder
주석이 달린 소스가 포함된 파일을 저장할 때마다 호출됩니다.
Eclipse 프로젝트에 대해 PojoBuilder를 활성화하려면 다음을 수행하십시오.
pojobuilder-4.3.0-annotations.jar
추가합니다.pojobuiler-4.3.0-jar-with-dependencies.jar
추가이 프로젝트의 소스를 직접 컴파일하려면 Gradle을 사용할 수 있습니다(build.gradle 참조).