Exhibitionism
Exhibitionism은 클래스 파일 변환 도구입니다. Exhibitionism은 모든 클래스, 필드, 메서드를 public, non-final로 만듭니다.
이 도구를 사용하여 nms, 또는 craftbukkit 클래스에 리플렉션 없이 접근할 수 있습니다.
컴파일
프로젝트를 컴파일하기 위해서, 깃허브 레포지토리를 로컬 머신에 클론합니다. gradlew 파일이 있는 디렉토리에서 터미널을 열고, 아래 명령어를 입력하여 프로젝트를 컴파일합니다.
./gradlew installDist (리눅스, MacOS)
gradlew.bat installDist (윈도우)
실행 스크립트와 런타임 라이브러리들이 build/install/Exhibitionism 폴더 아래에 설치됩니다.
사용법
build/install/Exhibitionism/bin 폴더에서 터미널을 열고 Exhibitionism (리눅스, MacOS) 또는 Exhibitionism.bat (윈도우)를 다음 명령행 인수와 함께 실행합니다.
--input
입력 파일의 이름 (.jar 파일)
--output
출력 파일의 이름. 이미 해당 파일이 존재하면, 덮어씁니다.
--parallel (선택, 기본값=1)
클래스 변환에 사용할 스레드 갯수
--nopublic (플래그)
이 플래그가 설정되면, public 화 작업을 진행하지 않습니다.
--noopen (플래그)
이 플래그가 설정되면, non-final 화 작업을 진행하지 않습니다.
--path (선택)
Exhibitionism 작업을 진행할 경로를 설정합니다. 쉼표(',')를 이용하여 여러개의 경로를 지정할 수 있습니다. 이 인수가 지정되지 않을경우, 모든 클래스파일에 대해 적용합니다.
--noStaticFinal (플래그)
이 플래그가 설정되면 static final 필드에 대해서 non-final 화 작업을 진행하지 않습니다.
예시 사용법
./Exhibitionism --input Bukkit.jar --output Bukkit-open.jar --parallel 8 --path net.minecraft.server,org.bukkit.craftbukkit --noStaticFinal
API 지원
Exhibitionism은 HeartPattern maven repository에 호스팅되어있습니다. 아래 코드를 사용하여 의존성을 추가합니다.
1 2 3 4 5 6 7 8 9 10 | repositories{ maven{ url 'https://maven.heartpattern.kr/repository/maven-public/' } } dependencies{ compile 'kr.heartpattern:Exhibitionism:1.0.0-SNAPSHOT' } | cs |
API는 간단합니다. 오직 한개의 메서드와 한개의 클래스만 사용하면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 | transform( ExhibitionismOptions( source = "bukkit.jar", destination = "bukkit-open.jar", parallel = 8, path = setOf("net.minecraft", "org.bukkit.craftbukkit"), logger = Logger.getGlobal(), public = true, open = true, noStaticFinal = true ) ) | cs |
exhibitionism-maven-plugin
Exhibitionism의 maven plugin입니다.
사용법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <repositories> <repository> <id>HeartPattern</id> <url>https://maven.heartpattern.kr/repository/maven-public/</url> </repository> </repositories> <build> <plugins> <plugin> <groupId>kr.heartpattern</groupId> <artifactId>exhibitionism-maven-plugin</artifactId> <version>1.0.0-SNAPSHOT</version> <executions> <execution> <phase>package</phase> <goals> <goal>exhibit</goal> </goals> </execution> </executions> </plugin> </plugins> </build> | cs |
설정
output
출력 파일을 지정합니다. 설정하지 않으면, 기존 파일을 바꿉니다.
parallel(기본값=1)
클래스를 변환할때 사용할 스레드의 갯수를 지정합니다. 설정하지 않으면, 단일 스레드를 사용합니다.
open(기본값=true)
non-final 화 작업을 진행할지 설정합니다.
publify(기본값=true)
public 화 작업을 진행할지 설정합니다.
debug(기본값=false)
디버깅 메세지를 출력할지 설정합니다.
noStaticFinal(기본값=false)
static final 필드에 대해 non-final 작업을 건너뛸지 설정합니다.
paths
Exhibitionism 작업을 진행할 경로를 지정합니다. 예를 들어 net/minecraft로 설정하면, net.minecraft 패키지에 대해서만 Exhibitionism 작업이 진행됩니다. 지정하지 않으면, 모든 파일에 대해 진행됩니다.
예시 설정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <plugin> <groupId>kr.heartpattern</groupId> <artifactId>exhibitionism-maven-plugin</artifactId> <version>1.0.0-SNAPSHOT</version> <executions> <execution> <phase>package</phase> <goals> <goal>exhibit</goal> </goals> </execution> </executions> <configuration> <output>open-all.jar</output> <open>true</open> <publify>true</publify> <parallel>8</parallel> <noStaticFinal>true</noStaticFinal> <debug>false</debug> <paths> <path>net/minecraft</path> <path>org/bukkit/craftbukkit</path> </paths> </configuration> </plugin> | cs |
링크
GitHub: https://github.com/HeartPattern/Exhibitionism
GitHub: https://github.com/HeartPattern/exhibitionism-maven-plugin
DDang_
2020.01.31좋은 글 감사합니다
YeeV
2020.03.31잘 사용 할게요!