이제서야 OSGi 에 관심이 생겨서 뭔가를 만들어보기 위해서 OSGi + Tomcat 6 + SpringDM 개발 환경을 구성해 봅니다.
Eclipse Indigo + Maven Integration for Eclipse
Create Project
File - New - Other... → Maven - Maven Project
[maven-archetype-quickstart] 선택합니다.
[Group Id], [Artifact Id] 아무거나 입력 합니다. -_-;;
[Package] 는 필요가 없습니다.
Create Target Definition
File - New - Other... → Plug-in Development - Target Definition
[Parent Folder]는 전에 만든 "spring-dm-platform" 프로젝트를 선택합니다.
File name: spring-dm-tomcat.target
Initalize the target definition with: Nothing
lib 폴더를 하나 생성합니다.
target 폴더는 메이븐 라이브러리가 복사되는 곳이고, lib 폴더는 메이븐으로 구하지 못한 라이브러를 넣어둘 것입니다.
spring-dm-tomcat.target 파일을 열어 편집합니다.
Target: SpringDM with Tomcat
오른쪽 Add... 버튼을 클릭해서 Locations 을 추가합니다.
Directory 선택
Variables.. 를 이용해서 현재 프로젝트 경로(project_loc)를 얻어내고 하위 폴더 target 을 입력합니다. (그냥 입력해도 됨..)
같은 방법으로 lib 폴더도 선택합니다.
파일 저장 후 Windows - Preferences - Plug-in Development - Target Platform
SpringDM with Tomcat 을 선택합니다.
Running OSGi Framework
이제 한번 실행시켜 봅시다.
Run - Run Configurations...
왼쪽 메뉴 중에 OSGi Framework 에서 오른쪽 버튼 클릭 - New
이름 적당히 지어 주시고 Run 을 클릭해 봅시다.
org.eclipse.osgi 플러그인이 없다고 에러가 납니다.
Setting Osgi Framework on Maven
이제 메이븐으로 OSGi Framework 라이브러리를 세팅합시다.
pom.xml 파일을 열어 아래와 같이 수정 합니다.
pom.xml 열기 접기
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tistory.antop</groupId>
<artifactId>spring-dm-platform</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring-dm-platform</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<target-platform.root>target</target-platform.root>
</properties>
<repositories>
<!-- SpringSource Enterprise Bundle Repository -->
<repository>
<id>com.springsource.repository.bundles.release</id>
<name>SpringSource Enterprise Bundle Repository - SpringSource Bundle Releases</name>
<url>http://repository.springsource.com/maven/bundles/release</url>
</repository>
<repository>
<id>com.springsource.repository.bundles.external</id>
<name>SpringSource Enterprise Bundle Repository - External Bundle Releases</name>
<url>http://repository.springsource.com/maven/bundles/external</url>
</repository>
<repository>
<id>com.springsource.repository.libraries.release</id>
<name>SpringSource Enterprise Bundle Repository - SpringSource Library Releases</name>
<url>http://repository.springsource.com/maven/libraries/release</url>
</repository>
<repository>
<id>com.springsource.repository.libraries.external</id>
<name>SpringSource Enterprise Bundle Repository - External Library Releases</name>
<url>http://repository.springsource.com/maven/libraries/external</url>
</repository>
</repositories>
<dependencies>
<!-- 라이브러리 설정 -->
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<versionRange>[1.0.0,)</versionRange>
<goals>
<goal>copy-dependencies</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<!-- 설정한 라이브러리를 outputDirectory로 복사한다 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${target-platform.root} </outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
접기
메이븐에 대해서 설명하지는 않겠습니다. -_-;;
위의 라이브러리 저장소(repository )는 SpringSource Repository(FAQ) 에서 확인할 수 있습니다.
이제 SpringSource Repository 에서 번들(라이브러리)를 하나씩 찾아서 넣어야 합니다. ㅠ_ㅠ;;
검색하는 방법은 [Advanced Search]나 오른쪽 상단 [Quick Search] 을 이용해서 검색하면 됩니다.
일단 OSGi Framework 실행 했을 때 없다고한 플러그인 라이브러리를 검색해봅시다.
검색해서 나온 버전 중 가장 최신 버전을 선택합니다.
중간에 보면 Maven 부분이 있습니다. 이걸 복사해서 <dependencies> </dependencies> 사이에 붙여넣기 하면 됩니다. ㅎㅎ
<dependencies>
<!-- 라이브러리 설정 -->
<dependency>
<groupId>org.eclipse.osgi</groupId>
<artifactId>org.eclipse.osgi</artifactId>
<version>3.7.1.R37x_v20110808-1106</version>
</dependency>
</dependencies>
저장 후 pom.xml 파일에서 오른쪽버튼 클릭 후 Run As - Maven install 클릭 합니다.
그러면 target 폴더에 jar 파일이 복사가 됩니다.
이제 spring-dm-tomcat.target 파일을 열어봅시다.
아래와 같이 번들이 추가 되어있습니다.
※ 메이븐을 이용해서 빠르게 라이브러리를 바꿔치기 하다보면 번들(라이브러리)이 갱신이 안될 때가 있는데 그냥 파일 닫았다가 다시 열어주면 갱신이 되더군요....
맨위의 타이틀 오른쪽에 "Set as Target Platform" 을 클릭해야 실제 적용이 됩니다. 주의!
이제 다시 Run Configurations 로 가봅시다. 추가한 번들이 올라와 있습니다. 선택 후 Run!
콘솔 창을 보면 OSGi Framework 가 실행되었습니다. ㅠ_ㅠ
이제 OSGi 할 준비가 된 것입니다. ㅋㅋ
톰켓이나 웹로직 같이 끄려면 빨간 버튼(Terminate)을 이용해서 끄면 됩니다.
나중에 톰켓를 띄우게 될텐데 OSGi Framework 한번 실행한 상태에서 한번 실행하면 톰켓 포트 충돌로 인한 에러를 볼 수 있습니다.
Setting SpringDM on Maven
바로 SpringDM을 적용해 봅시다!!
SpringSource Repository 에서 "spring", "spring-osgi", "slf4j" 를 검색해서 최신 버전을 적용 합니다.
pom.xml 열기 접기
<!-- Spring DM -->
<dependency>
<groupId>org.springframework.osgi</groupId>
<artifactId>org.springframework.osgi.core</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.osgi</groupId>
<artifactId>org.springframework.osgi.extender</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.osgi</groupId>
<artifactId>org.springframework.osgi.web</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.osgi</groupId>
<artifactId>org.springframework.osgi.web.extender</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.osgi</groupId>
<artifactId>org.springframework.osgi.io</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework.osgi</groupId>
<artifactId>org.springframework.osgi.extensions.annotation</artifactId>
<version>1.2.1</version>
</dependency>
<!-- Spring Framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.aop</artifactId>
<version>3.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.aspects</artifactId>
<version>3.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.beans</artifactId>
<version>3.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.context</artifactId>
<version>3.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.context.support</artifactId>
<version>3.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.core</artifactId>
<version>3.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.expression</artifactId>
<version>3.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.jdbc</artifactId>
<version>3.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.orm</artifactId>
<version>3.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.oxm</artifactId>
<version>3.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.transaction</artifactId>
<version>3.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.web</artifactId>
<version>3.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>org.springframework.web.servlet</artifactId>
<version>3.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aopalliance</groupId>
<artifactId>com.springsource.org.aopalliance</artifactId>
<version>1.0.0</version>
</dependency>
<!-- logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>com.springsource.slf4j.api</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>com.springsource.slf4j.log4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.apache.log4j</groupId>
<artifactId>com.springsource.org.apache.log4j</artifactId>
<version>1.2.16</version>
</dependency>
접기
이제 pom.xml 에서 마우스 오른쪽 버튼 - Run As - Maven install 해서 jar 파일을 target 에 생기게 합니다.
그리고 spring-dm-tomcat.target 파일을 열어서 ${project_loc}/target 폴더에 플러그인 갯수가 늘어났는지 확인합니다.
※ 만약 파일은 존재하는데 변경이 되지 안았다면 spring-dm-tomcat.target 파일 닫고 바로 다시 열어주면 카운트가 변경 되어 있을 겁니다.
상단 오른쪽의 "Set as Target Platform " 링크를 클릭하여 라이브러리를 적용시켜 줍니다.
Run Configurations 창으로 가서 추가된 번들(또는 라이브러리)를 선택합니다.
그 후 오른쪽 아래 "Validate Bundles" 버튼을 클릭합니다. 버튼명 그대로 번들들의 유효성을 검사 하게 됩니다.
아래와 같이 어떤 라이브러리에서 필요한 라이브러리가 빠져있는지 나옵니다.
웹에 관련된 부분은 바로 이어서 할 것이므로 일단 이 번들은 빼고 구동(Run)합니다.
아래와 같이 나오면 성공! 웹쪽을 뺀 SpringDM 까지 올라갔습니다.
osgi> log4j:WARN No appenders could be found for logger (org.springframework.osgi.extender.internal.activator.ContextLoaderListener).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
osgi> ss
Framework is launched.
id State Bundle
0 ACTIVE org.eclipse.osgi_3.7.1.R37x_v20110808-1106
1 ACTIVE org.springframework.transaction_3.2.1.RELEASE
2 ACTIVE org.springframework.osgi.core_1.2.1
3 ACTIVE org.springframework.osgi.extensions.annotations_1.2.1
4 ACTIVE com.springsource.org.apache.log4j_1.2.16
5 ACTIVE org.springframework.jdbc_3.2.1.RELEASE
6 ACTIVE org.springframework.oxm_3.2.1.RELEASE
7 ACTIVE org.springframework.aspects_3.2.1.RELEASE
8 ACTIVE com.springsource.org.apache.commons.logging_1.1.1
9 ACTIVE org.springframework.context.support_3.2.1.RELEASE
10 ACTIVE org.springframework.core_3.2.1.RELEASE
11 ACTIVE org.springframework.beans_3.2.1.RELEASE
12 ACTIVE org.springframework.context_3.2.1.RELEASE
13 ACTIVE org.springframework.aop_3.2.1.RELEASE
14 RESOLVED com.springsource.slf4j.log4j_1.6.1
Master=17
15 ACTIVE org.springframework.expression_3.2.1.RELEASE
16 ACTIVE org.springframework.orm_3.2.1.RELEASE
17 ACTIVE com.springsource.slf4j.api_1.6.1
Fragments=14
18 ACTIVE com.springsource.org.aopalliance_1.0.0
19 ACTIVE org.springframework.osgi.extender_1.2.1
20 ACTIVE org.springframework.osgi.io_1.2.1
osgi>
Configuration Log4j
OSGi Framework 를 실행 하면 아래와 같은 경고가 나오게 되는데 흔하디 흔한 log4j.properties / log4j.xml 파일 못 찾는 경고입니다.
log4j:WARN No appenders could be found for logger (org.springframework.osgi.extender.internal.activator.ContextLoaderListener).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
log4j.xml
첨부한 log4j.xml 파일을 프로젝트 폴더에 복사합니다.
Run Configurations 창의 Arguments 탭으로 이동합니다.
VM arguments 부분에 -Dlog4j.debug=true -Dlog4j.configuration=file:log4j.xml 를 추가합니다.
Working directory 부분은 현재 자기의 프로젝트 경로로 바꿔줍니다.
Workspace... 버튼 클릭 후 spring-dm-platform 프로젝트 폴더를 선택하면 됩니다.
이제 OSGi Framework 를 실행하면 로그가 출력 됩니다.
osgi> log4j: Using URL [file:log4j.xml] for automatic log4j configuration.
log4j: Preferred configurator class: org.apache.log4j.xml.DOMConfigurator
log4j: System property is :null
log4j: Standard DocumentBuilderFactory search succeded.
log4j: DocumentBuilderFactory is: com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
log4j: debug attribute= "null".
log4j: Ignoring debug attribute.
log4j: reset attribute= "false".
log4j: Threshold ="null".
log4j: Retreiving an instance of org.apache.log4j.Logger.
log4j: Setting [org.springframework.osgi.web.tomcat.internal] additivity to [false].
log4j: Level value for org.springframework.osgi.web.tomcat.internal is [debug].
log4j: org.springframework.osgi.web.tomcat.internal level set to DEBUG
log4j: Class name: [org.apache.log4j.ConsoleAppender]
log4j: Parsing layout of class: "org.apache.log4j.PatternLayout"
log4j: Setting property [conversionPattern] to [%d _ %t _ %p _ %c _ %m%n].
log4j: Adding appender named [console] to category [org.springframework.osgi.web.tomcat.internal].
log4j: Retreiving an instance of org.apache.log4j.Logger.
log4j: Setting [org.springframework] additivity to [false].
log4j: Level value for org.springframework is [info].
log4j: org.springframework level set to INFO
log4j: Adding appender named [console] to category [org.springframework].
log4j: Level value for root is [warn].
log4j: root level set to WARN
log4j: Adding appender named [console] to category [root].
2013-03-27 00:54:43,505 _ Start Level Event Dispatcher _ INFO
_ org.springframework.osgi.extender.internal.activator.ContextLoaderListener
_ Starting [org.springframework.osgi.extender] bundle v.[1.2.1]
2013-03-27 00:54:43,545 _ Start Level Event Dispatcher _ INFO
_ org.springframework.osgi.extender.internal.support.ExtenderConfiguration
_ No custom extender configuration detected; using defaults...
2013-03-27 00:54:43,550 _ Start Level Event Dispatcher _ INFO
_ org.springframework.scheduling.timer.TimerTaskExecutor _ Initializing Timer
osgi>
여기까지 했으면 이제 웹을 제외한 SpringDM을 사용할 준비가 되었습니다.
Setting Web Platform
이제 거의 다 왔습니다.... 후우~.. 이제 웹도 되게 합시다!
Run Configurations 창에서 전 단계에서 선택하지 않았던 4개의 웹 관련 번들을 선택 후 검사합니다. (Validate Bundles 버튼)
아래에 나온 없는 패키지가 포함된 번들을 찾아줘야 합니다.
일단 서블릿 2.4 버전을 찾아서 넣어줍시다.
pom.xml 보기 접기
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>com.springsource.javax.servlet</artifactId>
<version>2.4.0</version>
</dependency>
접기
이렇게 추가된 라이브러리를 적용한 후 다시 Run Configurations 창을 엽니다.
Add Required Bundles 버튼을 클릭하면 필요한 라이브러리를 자동으로 선택 해줍니다. (만약 있다면..)
이제 번들 유효성 검사를 해보면 아무 이상이 없다고 합니다.
실행! 잘 되는듯 하다가 에러가 나는군요...
2013-03-28 23:20:49,878 _ WebExtender-Init _ INFO
_ org.springframework.osgi.web.extender.internal.activator.WarListenerConfiguration
_ No custom extender configuration detected; using defaults...
Exception in thread "WebExtender-Init" java.lang.NoClassDefFoundError: org/apache/catalina/Loader
at o.s.osgi.web.extender.internal.activator.WarListenerConfiguration.createDefaultWarDeployer(WarListenerConfiguration.java:194)
at org.springframework.osgi.web.extender.internal.activator.WarListenerConfiguration.<init>(WarListenerConfiguration.java:105)
at org.springframework.osgi.web.extender.internal.activator.WarLoaderListener$1.run(WarLoaderListener.java:361)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.apache.catalina.Loader
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:513)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 4 more
톰켓 번들을 설치합시다.
내용이 너무 길어저 pom.xml 만 남깁니다.
pom.xml 열기 접기
<!-- tomcat -->
<dependency>
<groupId>org.apache.catalina.springsource</groupId>
<artifactId>com.springsource.org.apache.catalina.springsource</artifactId>
<version>6.0.32.S2-r1673</version>
</dependency>
<dependency>
<groupId>org.apache.coyote.springsource</groupId>
<artifactId>com.springsource.org.apache.coyote.springsource</artifactId>
<version>6.0.32.S2-r1673</version>
</dependency>
<dependency>
<groupId>org.apache.juli.springsource</groupId>
<artifactId>com.springsource.org.apache.juli.extras.springsource</artifactId>
<version>6.0.32.S2-r1673</version>
</dependency>
<dependency>
<groupId>org.apache.jasper.springsource</groupId>
<artifactId>com.springsource.org.apache.jasper.springsource</artifactId>
<version>6.0.32.S2-r1673</version>
</dependency>
<dependency>
<groupId>org.apache.el.springsource</groupId>
<artifactId>com.springsource.org.apache.el.springsource</artifactId>
<version>6.0.32.S2-r1673</version>
</dependency>
<!-- 2.4 에서 2.5 로 변경 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>com.springsource.javax.servlet</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>com.springsource.javax.servlet.jsp</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation</artifactId>
<version>1.1.0.v201105051105</version>
</dependency>
<dependency>
<groupId>javax.ejb</groupId>
<artifactId>com.springsource.javax.ejb</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>javax.xml.rpc</groupId>
<artifactId>com.springsource.javax.xml.rpc</artifactId>
<version>1.1.0.v20110517</version>
</dependency>
<dependency>
<groupId>javax.xml.soap</groupId>
<artifactId>com.springsource.javax.xml.soap</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>com.springsource.javax.activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>com.springsource.javax.xml.ws</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>com.springsource.javax.xml.bind</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>javax.xml.stream</groupId>
<artifactId>com.springsource.javax.xml.stream</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>com.springsource.javax.persistence</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>com.springsource.javax.el</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.jdt</groupId>
<artifactId>com.springsource.org.eclipse.jdt.core.compiler.batch</artifactId>
<version>3.6.1</version>
</dependency>
접기
번들(라이브러리) 적용 후 우효성 검사를 하면 이상이 없다고 합니다.
보면 서블릿 번들이이 2.4/2.5 두개가 있는데 이중에 한가지만 선택하면 되겠습니다.
이제 실행해 봅시다.
WebExtender-Init _ ERROR _ o.s.osgi.web.deployer.tomcat.TomcatWarDeployer _ No Catalina Service found, bailing out
o.s.osgi.service.ServiceUnavailableException: service matching filter=[(objectClass=org.apache.catalina.Service)] unavailable
WebExtender-Init _ ERROR _ o.s.osgi.web.extender.internal.activator.WarLoaderListener _ Cannot property start Spring DM WebExtender; stopping bundle...
o.s.osgi.OsgiException: Cannot create Tomcat deployer
Caused by: o.s.osgi.service.ServiceUnavailableException: service matching filter=[(objectClass=org.apache.catalina.Service)] unavailable
WebExtender-Init _ INFO _ org.springframework.scheduling.timer.TimerTaskExecutor _ Cancelling Timer
org.apache.catalina.Service 서비스를 찾을 수 없다. 즉 톰켓이 안 떠있다 는 겁니다.
catalina.start.osgi-6.0.16-20080327.121306-4.jar
첨부한 번들을 lib 폴더에 복사해주고 적용 시킵니다. (이건 메이븐에 없더군요...)
마지막으로 실행!
Tomcat Catalina Start Thread _ INFO _ o.s.osgi.web.tomcat.internal.Activator _ Starting Apache Tomcat/6.0.32 ...
Tomcat Catalina Start Thread _ DEBUG _ o.s.osgi.web.tomcat.internal.Activator _ Reading default server configuration from bundleresource://45.fwk1110027070/conf/embedded-server-defaults.properties
2013. 3. 28 오후 11:40:53 org.apache.catalina.startup.Embedded start
정보: Starting tomcat server
2013. 3. 28 오후 11:40:53 org.apache.catalina.core.StandardEngine start
정보: Starting Servlet Engine: Apache Tomcat/6.0.32
2013. 3. 28 오후 11:40:53 org.apache.coyote.http11.Http11Protocol init
정보: Initializing Coyote HTTP/1.1 on http-127.0.0.1-8080
2013. 3. 28 오후 11:40:53 org.apache.coyote.http11.Http11Protocol start
정보: Starting Coyote HTTP/1.1 on http-127.0.0.1-8080
Tomcat Catalina Start Thread _ INFO _ o.s.osgi.web.tomcat.internal.Activator _ Succesfully started Apache Tomcat/6.0.32
WebExtender-Init _ INFO _ o.s.osgi.service.importer.support.OsgiServiceProxyFactoryBean _ Found mandatory OSGi service for bean []
Tomcat Catalina Start Thread _ INFO _ o.s.osgi.web.tomcat.internal.Activator _ Published Apache Tomcat/6.0.32 as an OSGi service
WebExtender-Init _ INFO _ o.s.osgi.web.deployer.tomcat.TomcatWarDeployer _ Found service Catalina
후우... 성공!
web.xml
마지막으로 첨부한 web.xml 파일을 conf/web.xml 에 복사합니다. (그냥 톰켓에 있는 web.xml 입니다)
이 파일이 있어야 나중에 웹어플 배치했을 때 정상적으로 됩니다.
안그러면 배치했을 때 아래 로그와 함께 영원히 404를 볼 수 있습니다.
[ INFO - WebExtender-Init] org.springframework.osgi.web.extender.internal.activator.WarLoaderListener - hello.web (hello.web) is a WAR, scheduling war deployment on context path [/hello.web] (web.xml found at [bundleentry://11.fwk854535264/WEB-INF/web.xml])
2013. 3. 30 오전 2:03:35 org.apache.catalina.startup.ContextConfig defaultWebConfig
정보: No default web.xml
[ INFO - Timer-0] org.springframework.osgi.web.deployer.tomcat.TomcatWarDeployer - Successfully deployed bundle [hello.web (hello.web)] at [/hello.web] on server org.apache.catalina.startup.Embedded/1.0
Trouble Shooting
설정을 바꿨는데도 안바뀐다면?
Run Configurations 의 Settings 탭에서 "Clear the configuration area before launching"를 체크해주세요.
중간 중간 아래와 같은 에러가 난다면? 하라는 대로 하면 됩니다. -_-;;
마지막으로 최종 pom.xml 파일 첨부합니다.
pom.xml