나는 런타임과 컴파일 시간의 차이와 둘을 구별하는 방법을 이해하지만 컴파일 시간과 런타임 종속성을 구분할 필요가 없다고 생각합니다.
일반적인 컴파일 시간 및 런타임 개념과 Maven 특정 compile
및 runtime
범위 종속성은 매우 다른 두 가지입니다. 프레임이 같지 않기 때문에 직접 비교할 수 없습니다. 일반적인 컴파일 및 런타임 개념은 광범위하지만 maven compile
및 runtime
범위 개념은 컴파일 또는 실행 시간에 따른 종속성 가용성 / 가시성에 관한 것입니다.
Maven은 무엇보다도 javac
/ java
래퍼이며 Java에서는 지정하는 컴파일 시간 클래스 경로와 지정 javac -cp ...
하는 런타임 클래스 경로가 있음을 잊지 마십시오 java -cp ...
.
Maven compile
범위를 Java 컴파일 및 런타임 클래스 경로에 종속성을 추가하는 방법으로 고려하는 것은 잘못이 아닙니다 (javac
및 java
) Maven runtime
범위는 Java 런타임 클래스 경로 ( javac
) 에만 종속성을 추가하는 방법으로 볼 수 있습니다 .
내가 질식하고있는 것은 이것이다 : 어떻게 프로그램이 컴파일 동안 의존했던 런타임에 어떤 것에 의존하지 않을 수 있는가?
설명하는 내용은 범위 runtime
및 compile
범위 와 관련이 없습니다 . 종속성이 런타임이 아닌 컴파일 타임에 종속되도록 지정
하는 provided
범위에 더 가깝습니다.
컴파일하는 데 종속성이 필요하기 때문에 사용하지만 패키지 구성 요소 (JAR, WAR 또는 기타)에는 종속성이 이미 환경 에 의해 제공 되기 때문에 포함하지 않으려 고 합니다. 서버 또는 모든 서버에 포함될 수 있습니다. Java 애플리케이션으로 지정된 클래스 경로의 경로가 시작됩니다.
내 Java 앱이 log4j를 사용하는 경우 컴파일 (log4j 내부에서 멤버 메서드와 통합 및 호출하는 내 코드) 및 런타임 (내 코드는 log4j 내부의 코드가 한 번 발생하는 일을 제어 할 수 없음)을 위해 log4j.jar 파일이 필요합니다. .jar가 실행 됨).
이 경우에는 그렇습니다. 그러나 나중에 다른 로깅 구현 (log4J 2, logback 또는 기타)으로 전환 할 수 있도록 slf4j에 의존하는 이식 가능한 코드를 log4j 앞에 파사드로 작성해야한다고 가정합니다.
이 경우 pom에서 slf4j를 compile
종속성 (기본값)으로 지정해야하지만 log4j 종속성을 종속성으로 지정합니다 runtime
.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>...</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>...</version>
<scope>runtime</scope>
</dependency>
이런 식으로 컴파일 된 코드에서 log4j 클래스를 참조 할 수 없지만 slf4j 클래스는 계속 참조 할 수 있습니다. 시간
과 함께 두 개의 종속성을 지정하면 compile
컴파일 된 코드에서 log4j 클래스를 참조하는 것을 막을 수 없으며 로깅 구현과 원하지 않는 결합을 만들 수 있습니다.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>...</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>...</version>
</dependency>
runtime
범위 의 일반적인 사용은 JDBC 종속성 선언입니다. 이식 가능한 코드를 작성하려면 클라이언트 코드가 특정 DBMS 종속성 (예 : PostgreSQL JDBC 종속성)의 클래스를 참조하는 것을 원하지 않지만 런타임에 클래스를 만드는 데 필요한 것처럼 애플리케이션에 모두 포함하기를 원합니다. JDBC API는이 DBMS와 함께 작동합니다.