기업 급 Spring 최 적 실천 - 프로젝트 배치
Production src / main / java - JAVA 소스 패키지 디 렉 터 리 와 클래스 src / main / resources - JAVA 자원 디 렉 터 리 (예: *. properties 파일, spring 프로필 등) Test src / test / java - 테스트 코드 패키지 와 클래스 src / test / resources - 테스트 자원 디 렉 터 리 (예: *. properties 파일, spring 프로필 등)
프로젝트 디 렉 터 리 구성 예:
── pom.xml └── src ├── main │ ├── java │ │ └── com │ │ └── gordondickens │ │ └── sample │ │ ├── domain │ │ │ └── MyDomain.java │ │ ├── repository │ │ │ └── MyDomainRepository.java │ │ ├── service │ │ │ ├── MyDomainService.java │ │ │ └── internal │ │ │ └── MyDomainServiceImpl.java │ │ └── web │ │ └── MyDomainController.java │ ├── resources │ │ ├── META-INF │ │ │ └── spring │ │ │ ├── applicationContext.xml │ │ │ └── database.properties │ │ ├── logback-access.xml │ │ └── logback.xml │ └── webapp │ ├── WEB-INF │ │ ├── classes │ │ ├── i18n │ │ ├── layouts │ │ ├── spring │ │ │ └── webmvc-config.xml │ │ ├── views │ │ │ ├── myDomain │ │ │ │ ├── create.jsp │ │ │ │ ├── list.jsp │ │ │ │ ├── show.jsp │ │ │ │ └── update.jsp │ │ │ ├── dataAccessFailure.jsp │ │ │ ├── index.jsp │ │ │ ├── resourceNotFound.jsp │ │ │ ├── uncaughtException.jsp │ │ │ └── views.xml │ │ └── web.xml │ ├── images │ └── styles ├── site │ ├── apt │ ├── fml │ ├── site.xml │ └── xdoc └── test ├── java │ └── com │ └── gordondickens │ └── sample │ └── service │ └── MyDomainServiceTests.java └── resources ├── com │ └── gordondickens │ └── sample │ └── service │ └── MyDomainServiceTests-context.xml └── logback-test.xml
프로젝트 의존
저 는 Maven 의 슈퍼 팬 입 니 다. 일치 하 는 구축 구 조 를 제공 하고 많은 플러그 인 을 가지 고 있 습 니 다.Gradle 은 Groovy 기반 의 새로운 구축 도구 로 Maven 구 조 를 지원 합 니 다.만약 당신 이 여전히 Ant 를 사용 하고 있다 면, 나 는 당신 이 Maven 이나 Gradle 로 이전 하 는 것 을 강력 히 건의 합 니 다.기업 구축 도구 가 직면 한 도전 중 하 나 는 관리 전달 적 의존 이다. 여기 서 이런 도전 에 직면 할 수 있 는 제안 이 있다.
의존 버 전 은 < properties / > 노드 에서 지정 한 버 전 번호 보다 낮 게 사용 하지 마 십시오. 그러면 새로운 버 전 을 업그레이드 하고 테스트 하기 쉽 습 니 다.모든 플러그 인의 버 전 번 호 를 포함해 야 합 니 다!Maven 에 내 장 된 부모 POM 의 플러그 인 버 전에 의존 하지 마 십시오.관리 의존 Maven 의 < Dependency Management / > 노드 제어 현식 과 은 식 버 전!버 전 번 호 를 여기에 지정 하면 전달 성 의존 Enforcer Plugin (강제 실행 플러그 인) 을 해결 합 니 다. 호 환 되 지 않 는 (또는 오래된) jar 를 직접 (또는 간접) 포함 하 는 것 을 금지 합 니 다.예 를 들 어 SLF4J 1.5, 1.6, SLF4J 1.7 은 함께 실행 할 수 없 기 때문에 프로젝트 구축 에 혼합 의존 이 있 는 버 전 을 금지 해 야 합 니 다.Spring 은 많은 오픈 소스 프로젝트 에 사용 되 며, 오래된 버 전 을 참조 하 는 경우 도 있 습 니 다. 따라서 Google 구축 에 포 함 된 spring jar 버 전 을 제어 해 야 합 니 다.강제 실행 예: · JAVA 1.6 사용 확 보 · MAVEN 버 전 2.2.1 - 3.0. x · spring 을 확보 하 는 jar 는 3.1 또는 업데이트 버 전 · 오래된 javassist 금지,org. java ssist · commons - logging 이나 commons - logging - api 의존 이 없 는 지 확 보 · log4j 의존 이 없 는 지 확 보 · slf4j 1.5 또는 1.6 의존 이 없 는 지 확 보 · 낡은 hsqldb 금지, org. hsqldb · 낡은 aspectj 금지, org. aspectj 를 사용 해 야 합 니 다.
<properties>
...
<java.version>1.6</java.version>
...
<maven.enforcer.plugin>1.2</maven.enforcer.plugin>
<maven.version.range>[2.2.1,3.1.0)</maven.version.range>
...
</properties>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>${maven.enforcer.plugin}</version>
<executions>
<execution>
<id>enforce-banned-dependencies</id>
<goals>
<goal>enforce</goal>
</goals>
<configuration>
<rules>
<bannedDependencies>
<searchTransitive>true</searchTransitive>
<excludes>
<exclude>javassist:javassist</exclude>
<exclude>commons-logging</exclude>
<exclude>aspectj:aspectj*</exclude>
<exclude>hsqldb:hsqldb</exclude>
<exclude>log4j:log4j</exclude>
<exclude>org.slf4j:1.5*</exclude>
<exclude>org.springframework:2.*</exclude>
<exclude>org.springframework:3.0.*</exclude>
</excludes>
</bannedDependencies>
<requireMavenVersion>
<version>${maven.version.range}</version>
</requireMavenVersion>
<requireJavaVersion>
<version>${java.version}</version>
</requireJavaVersion>
</rules>
<fail>true</fail>
</configuration>
</execution>
</executions>
</plugin>
Smart Logging
· System. out 을 사용 하지 마 세 요 · System. err 를 사용 하지 마 세 요 · 항상 SLF4j 를 사용 합 니 다 · 항상 Logback 을 사용 합 니 다 · Apache comons logging 금지 (JCL) aka Jakarta Commons Logging · Java util logging 사용 금지 (JUL) 클래스 에서 SFL4J 를 사용 해 야 합 니 다 (log4j, jcl, jul, logback 아 님):
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
public class MyClass {
private static final Logger logger =
LoggerFactory.getLogger(MyClass.class);
...
}
아래 의 예 에서 SLF4J 는 jacl - over - slf4j 와 jl - toslf4j 를 제공 하여 JCL 과 JUL 에 사용 합 니 다.Spring 은 JCL 을 사용 하기 때문에 jcl - over - slf4j 를 사용 하여 spring 의 로그 내용 을 처리 해 야 합 니 다.
<properties>
...
<logback.version>1.0.10</logback.version>
...
<slf4j.version>1.7.4</slf4j.version>
...
</properties>
...
<dependencies>
...
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
...
</dependencies>
...
<dependencyManagement>
<dependencies>
...
<!-- Logging with SLF4J & LogBack -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback.version}</version>
</dependency>
...
</dependencies>
</dependencyManagement>
로그 프로필
src/main/resources/logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
<!-- To enable JMX Management -->
<jmxConfigurator/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%.-1level|%-40.40logger{0}|%msg%n</pattern>
</encoder>
</appender>
<logger name="com.mycompany.myapp" level="debug" />
<logger name="org.springframework" level="info" />
<logger name="org.springframework.beans" level="debug" />
<root level="warn">
<appender-ref ref="console" />
</root>
</configuration>
src/main/resources/logback-test.xml
같은 설정 입 니 다. 다만 이 설정 은 환경 을 테스트 하 는 데 사 용 됩 니 다.
src/main/resources/logback-access.xml
웹. xml 에서 Logback TeeFilter 를 사용 할 때 서버 접근 로 그 를 설정 합 니 다.
HttpRequest 와 HttpResponses 메시지 가 표시 되 거나 기 록 될 수 있 습 니 다.RESTful 테스트 를 만 드 는 데 사용 합 니 다.
NOTE: 로그 설정 에 ${user. dir} 을 사용 하면 로그 파일 은 프로젝트 루트 디 렉 터 리 에 생 성 됩 니 다.
우 리 는 이것 에 근거 하여 서로 다른 생산 환경 을 배치 할 것 이다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
<filter class="ch.qos.logback.access.filter.CountingFilter">
<name>countingFilter</name>
</filter>
<appender name="accessfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${user.dir}/logs/app-access.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${user.dir}/logs/app-access.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>combined</pattern>
</encoder>
</appender>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%n%fullRequest%n%fullResponse%n</pattern>
</encoder>
</appender>
<appender name="reqrespfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${user.dir}/logs/app-req-resp.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${user.dir}/logs/app-req-resp.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%n%fullRequest%n%fullResponse%n</pattern>
</encoder>
</appender>
<appender-ref ref="accessfile" />
<appender-ref ref="reqrespfile" />
<appender-ref ref="console" />
</configuration>
Jetty 와 Tomcat.
개발 자 는 MAVEN 플러그 인 설정 에 따라 Jetty 나 Tomcat 를 테스트 에 사용 할 수 있 습 니 다.아래 플러그 인 은 JMX, SLF4j, Logback, Logback Access 를 설정 합 니 다.Jetty $mvn clean install Jetty: run 실행 Tomcat 7 $mvn clean install tomcat 7: run NOTE: tomcat: run 을 사용 하지 마 세 요. 오래된 tomcat 플러그 인 입 니 다.
<properties>
...
<maven.jetty.plugin>8.1.10.v20130312</maven.jetty.plugin>
...
<maven.tomcat.plugin>2.1</maven.tomcat.plugin>
...
</properties>
...
<plugins>
...
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>${maven.tomcat.plugin}</version>
<configuration>
<systemProperties>
<com.sun.management.jmxremote>true</com.sun.management.jmxremote>
<com.sun.management.jmxremote.port>8050</com.sun.management.jmxremote.port>
<com.sun.management.jmxremote.ssl>false</com.sun.management.jmxremote.ssl>
<com.sun.management.jmxremote.authenticate>false</com.sun.management.jmxremote.authenticate>
<java.util.logging.manager>org.apache.juli.ClassLoaderLogManager</java.util.logging.manager>
<logback.ContextSelector>JNDI</logback.ContextSelector>
</systemProperties>
</configuration>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>${slf4j.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${maven.jetty.plugin}</version>
<configuration>
<webAppConfig>
<contextPath>/${project.name}</contextPath>
</webAppConfig>
<stopPort>9966</stopPort>
<stopKey>shutterdown</stopKey>
<requestLog implementation="ch.qos.logback.access.jetty.RequestLogImpl">
<fileName>./src/main/resources/logback-access.xml</fileName>
</requestLog>
<systemProperties>
<systemProperty>
<name>logback.configurationFile</name>
<value>./src/main/resources/logback.xml</value>
</systemProperty>
<systemProperty>
<name>com.sun.management.jmxremote</name>
<value>true</value>
</systemProperty>
<systemProperty>
<name>com.sun.management.jmxremote.port</name>
<value>8050</value>
</systemProperty>
<systemProperty>
<name>com.sun.management.jmxremote.ssl</name>
<value>false</value>
</systemProperty>
<systemProperty>
<name>com.sun.management.jmxremote.authenticate</name>
<value>false</value>
</systemProperty>
</systemProperties>
</configuration>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>${slf4j.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</plugin>
...
</plugins>
로그 백 도 우미 설정 (web. xml)
Logback 상태 확인 가능
...
<servlet>
<servlet-name>ViewStatusMessages</servlet-name>
<servlet-class>ch.qos.logback.classic.ViewStatusMessagesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ViewStatusMessages</servlet-name>
<url-pattern>/logbackStatus</url-pattern>
</servlet-mapping>
...
Logback Tee Filter 를 사용 하여 HttpRequest 와 HttpResponse 의 데 이 터 를 필터 링 합 니 다....
<filter>
<filter-name>TeeFilter</filter-name>
<filter-class>ch.qos.logback.access.servlet.TeeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TeeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...
Spring 프로필
일치 하 는 파일 이름 규칙 을 사용 합 니 다. 모든 프로필 은 같은 접 두 사 를 가지 고 있 습 니 다. 예 를 들 어 applicationConfig *. xml.(번역 주: 저 는 app - *. xml) 예 를 들 어 app - bootstrap. xml, app - database. xml, app - cache. xml, app - security. xml 를 계속 사용 합 니 다. 뒤의 블 로그 에서 기업 급 spring 설정 의 가장 좋 은 실천 을 구체 적 으로 말씀 드 리 겠 습 니 다.설정 디 렉 터 리: src / main / resources / META - INF / spring - Spring XML 설정 디 렉 터 리 src / main / webapp / WEB - INF / spring - Spring MVC 설정 디 렉 터 리
Maven 설정 완료
Maven 최 적 실천 프로필 POM. xml
MAVEN 최 적 실천 프로필 의 특징: · 모든 버 전 번 호 는 properties 노드 에서 설정 합 니 다.Dependency Management 노드 제어 의존 전달; ·모든 버 전 번호 가 있 는 플러그 인 은 Plugin Management 노드 에서 정의 합 니 다.강제 실행 플러그 인 은 호 환 되 지 않 는 의존 도 를 구축 하지 않 습 니 다.site 플러그 인 을 사용 하여 공용 보고 가 있 는 플러그 인 을 설정 합 니 다.Eclipse 플러그 인 은 새로운 Eclipse 의 Maven 플러그 인 을 사용 합 니 다. 오래된 것 은 Sonatype 입 니 다.Idea (IntelliJ) 플러그 인 은 시간 이 지 났 습 니 다. 포함 되 지 않 습 니 다.버 전 번호 플러그 인 은 패키지 와 플러그 인의 업데이트 에 의존 하 는 지 확인 합 니 다.
자주 사용 하 는 Maven 명령
디 스 플레이 업데이트 의존 $mvn versions: display - dependency - updates 디 스 플레이 플러그 인 업데이트 $mvn versions: display - plugin - updates 디 스 플레이 의존 트 리 $mvn dependency: tree - ddeetail 디 스 플레이 의존 목록 $mvn dependency: list 디 스 플레이 유효한 POM $mvn help: effective - pom 디 스 플레이 항목 설정 $mvn help: effective - settings 디 스 플레이 시스템 과 환경 변수 $mvn help: system 구축 클래스 경로 (Class Path) $mvn dependency: build - classpath
본문: Enterprise Spring Best Practices – Part 1 – Project Config 저자: 고 든
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.