Java 리소스가 iOS 리소스에 매핑되는 방식

Java 리소스란 무엇인가요?

자바 리소스는 자바 애플리케이션 및 라이브러리와 함께 패키징된 데이터 파일입니다. 이러한 리소스는 java.net.URL를 반환하는 Class.getResource(String name)java.io.InputStream를 반환하는 Class.getResourceAsStream(String name)가 런타임에 로드됩니다. getResourceAsStream() 메서드는 일반적으로 리소스를 사용할 수 있을 것으로 예상되는 경우에 사용됩니다. 사용 가능하지 않으면 IOException이 발생하기 때문입니다. 리소스가 없으면 getResource() 메서드는 null을 반환하므로 선택적 리소스를 테스트하는 데 유용합니다.

리소스 이름 및 경로

J2ObjC는 리소스의 상대 또는 절대 경로를 사용하여 애플리케이션의 기본 번들 ([NSBundle mainBundle])을 확인하여 리소스를 찾습니다.

상대 경로

리소스 경로를 지정할 때 상대 경로를 사용하는 것이 좋습니다. 상대 경로는 슬래시 ('/')로 시작하지 않습니다. 상대 경로로 리소스를 읽을 때 클래스의 패키지 이름이 수정되어 패키지 이름의 마침표 ('.')를 슬래시 ('/')로 변경하면 Class.getResource(String name) 또는 Class.getResourceAsStream(String name) 메서드 호출에 지정된 상대 경로가 패키지 경로에 추가됩니다.

예를 들어 앱에 foo.bar.Mumble 클래스가 있다면 해당 패키지의 클래스를 기준으로 한 모든 리소스의 기본 경로는 /foo/bar입니다. Mumble.class.getResource("oops/error.jpg")가 호출되면 oops/error.jpg가 패키지 경로에 추가되므로 전체 리소스 경로는 /foo/bar/oops/error.jpg입니다.

절대 경로

또한 리소스 이름을 슬래시 ('/')로 시작하여 절대 경로를 사용하여 리소스에 액세스할 수도 있습니다. 패키지 이름은 무시되므로 J2ObjC는 애플리케이션의 자바 소스의 Class.getResource(String name) 또는 Class.getResourceAsStream(String name) 참조에 지정된 경로를 정확히 사용하여 애플리케이션의 기본 번들에서 절대 경로를 찾습니다. 위의 예에서 Mumble.class.getResource("/oops/error.jpg")foo.bar 패키지 이름을 무시하고 /oops/error.jpg의 전체 리소스 경로를 갖습니다.

iOS 앱에 리소스 추가

Xcode에서 iOS 앱에 리소스 파일을 추가하려면 빌드 대상의 빌드 단계 탭을 엽니다. 다음 안내를 따르세요.

  • 일반 탭에서 + 아이콘을 클릭하고 새 파일 복사 단계를 선택합니다.
  • '리소스'를 대상으로 선택합니다 (Java 리소스가 아님).
  • 리소스의 디렉터리를 지정합니다.
  • +를 선택하고 목록에 파일을 추가합니다.

상대 리소스 경로를 사용하든 절대 경로를 사용하든 각 리소스 디렉터리에는 Xcode 빌드에서 별도의 파일 복사 빌드 단계가 필요합니다.

JreEmulation 프로젝트에는 라이브러리의 단위 테스트를 실행하는 'JRE JUnit Tests' 앱이 있습니다. 대상의 빌드 단계를 선택하여 여러 파일 복사 단계를 확인합니다. 리소스에서 사용하는 상대 경로마다 하나씩입니다. 여기서 ClassTest.java는 먼저 절대 경로와 상대 경로를 사용하여 동일한 리소스를 로드합니다. 테스트 리소스는 이 파일 복사 빌드 단계를 사용하여 포함됩니다.

Xcode 리소스