Skip to content

cxf-maven проект на Eclipse

Синопсис

В продолжении поста о том, как поднимать CXF Servlet используя командную строку, сегодня поговорим о том как делать тоже самое, только используя maven+Eclipse.
Для этого примера нам потребуется:

  1. Среда разработки Eclipse
  2. Установленный плагин m2eclipse-wtp который поддерживает работу с maven приложениями в eclipse. Как этот плагин установить подробно описано в посте Установка maven плагина для Eclipse
  3. Установленные плагины Web Tools Platform (WTP) 3.2.5 и Web Tools Platform SDK (WTP SDK) 3.2.5 которые поддерживают запуск вэб приложения из эклипса. Как эти плагины установить подробно описано в посте Установка WTP плагина для Eclipse


В этом посте сделаем вот что:

  1. Возьмем Eclipse
  2. Создадим maven проект
  3. Добавим интерфейс который будет представлять сервис
  4. Добавим класс имплементирующий интерфейс
  5. Добавим необходимую конфигурацию
  6. Нажмем на одну кнопку и проект соберется и заранится на сервере tomcat, который идет вместе с эклипсом (после установки плагина WTP)

Преимущество (а может быть недостаток) этого подхода заключается в том, что eclipse скрывает всю ту черную работу, которую мы записали в билд скрипт в предыдущем посте, а именно создание билд директории, компиляция java плайнтекстовых классов из каталога src, которые зависят от библиотек, которые лежат в каталоге lib (кстати как мы догадались какие джарники в lib ложить?), создание структуры вэб приложения в каталоге build, создание варника, и деплоинг его на сервер. Все что я перечислил все это eclipse умеет делать сам, кроме одно, единственное что eclipse не делает, это никаких джарников никуда не ложет, поэтому либо мы сами указываем эклипсу где их взять (например указываем их пути в свойствах проекта) либо просим maven нам их добыть. Вот ради этого мы создаем maven проект.

1. Maven проект

После того как maven плагин установлен, можно создавать maven проект. Для этого выбираем File->New->Other… В секции Maven выбираем Maven Project и жмем Next:

create_maven_project11
Еще раз жмем Next и в появившимся окне New Maven Project из списка выбираем maven-archetype-webapp:

create_maven_project2
Жмем Next и вводим в поле group Id com.cxf.example, а в поле Artifact Id cxf:

create_maven_project31
После того как нажмем на Finish, в Package Explorer появится дерево проекта:

tree_of_maven_project1

Java code

После того как проект создан, добавляем java классы.
Сначала добавим интерфейс который будет сервисом:

package service;

import javax.ws.rs.GET;
import javax.ws.rs.Path;

@Path("/test-service/")
public interface TestService {
	@GET
    @Path("/test")
    public String execute();
}

После того как интерфейс добавлен, теперь добавляем имплементацию интерфейса

package service.impl;

import service.TestService;

public class TestServiceImpl implements TestService {

	public String execute() {
		return "test CXF Servlet";
	}
}

pom.xml

pom.xml необходим для того, чтобы все зависимости в проекте могли резрезолвиться. Когда мы добавили интерфейс TestService, то в нем eclipse подчеркнул аннотации @Path и @Get красным цветом. Это связано с тем, что их не может найти компилятор javac. Так как это мавенский проект, то все зависимости или иначе пути к джарникам, ищутся в локальном репозитории, который на линуксе по умолчанию находится в $HOME/.m2/repository. Искать зависимости maven будет только тогда, когда мы скажем ему в файле pom.xml какие зависимости ему искать. Добавим между тэгами dependencies те зависимости, которые maven будет искать, в нашем проекте это три зависимости: spring-context, spring-web и org.apache.cxf.

<!-- Spring -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>3.1.0.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-web</artifactId>
	<version>3.1.0.RELEASE</version>
</dependency>

<!-- CXF -->
<dependency>
	<groupId>org.apache.cxf</groupId>
	<artifactId>cxf-rt-frontend-jaxrs</artifactId>
	<version>2.7.0</version>
</dependency>

Привожу весь 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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.zheka</groupId>
  <artifactId>cxfServlet</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>cxfServlet Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>

	<!-- Spring -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>3.1.0.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
		<version>3.1.0.RELEASE</version>
	</dependency>

	<!-- CXF -->
	<dependency>
		<groupId>org.apache.cxf</groupId>
		<artifactId>cxf-rt-frontend-jaxrs</artifactId>
		<version>2.7.0</version>
	</dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>cxfServlet</finalName>
  </build>
</project>

Как только необходимые зависимости добавлены в pom.xml, maven немедленно попытается разрезолвить их, для этого сначала он обратиться в локальный репозиторий, и если он их там не найдет, как в нашем случае, начнет их закачивать из удаленного репозитория. Весь этот процесс eclipse скрывает, показывая только окно User Operation is Waiting:

updating_maven_repository1
После этого аннотации @Path и @Get для компилитора javac станут известны.

web.xml

Чтобы контейнер знал, какой класс из CXF фреймворка вызывать, мы должны указать его в web.xml:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>

	<display-name>RestDemo</display-name>
	<description>RestDemo</description>

	<!-- Spring -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>WEB-INF/spring-context.xml</param-value>
	</context-param>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- CXF -->
	<servlet>
		<servlet-name>CXFServlet</servlet-name>
		<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>CXFServlet</servlet-name>
		<url-pattern>/rest/*</url-pattern>
	</servlet-mapping>
</web-app>

Тот класс, который контейнеру сервлетов нужно вызвать называется org.apache.cxf.transport.servlet.CXFServlet, именно его мы указываем между тэгами servlet-class.

Связываем все вместе используя Spring

И так, у нас классы добавлены, зависимости разрезолвены, web.xml для контейнера сервлетов добавлен, осталось теперь связать классы спрингом, для этого добавляем spring-context.xml в каталоге WEB-INF:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     	xmlns:cxf="http://cxf.apache.org/core"
		xmlns:jaxws="http://cxf.apache.org/jaxws"
		xmlns:jaxrs="http://cxf.apache.org/jaxrs"
		xsi:schemaLocation="
			http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
			http://www.springframework.org/schema/beans
			http://www.springframework.org/schema/beans/spring-beans.xsd
			http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
			http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

	<import resource="classpath:META-INF/cxf/cxf.xml"/>
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>

	<bean id="serviceBean" class="service.impl.TestServiceImpl">
	</bean>

  	<jaxrs:server id="restController" address="/">
  		<jaxrs:serviceBeans>
  			<ref bean="serviceBean"/>
  		</jaxrs:serviceBeans>
  	</jaxrs:server>

</beans>

xml файл spring-context.xml достаточно просто, в нем мы создаем только один bean и привязываем его к серверу.

Сборка и запуск

Теперь нам осталось собрать и запустить вэб приложение. Запускать будем в контейрене сервлетов tomcat. Для этого щелкаем по проекту правой кнопкой мыши и выбираем пункт меню Run As->Run on Server:

addting_tomcat1

Если приложение запускается в первый раз, то eclipse предложит выбрать контейнер сервлетов для запуска. Выбераем Tomcat v7.0 Server (именно tomcat v7 установлена у меня на машине) и жмем на Next:

addting_tomcat2

Далее нужно указать эклипсу где контейнер tomcat лежит, жмем на Browse…:

addting_tomcat3

и ищем tomcat в файловой системе. Нашли, выбираем каталог где он лежит и жмем на Ok:

addting_tomcat4

Далее жмем на Next:

addting_tomcat5

На последнем шаге надо перенести из секции Available в секцию Configured те вэб приложения, которые мы хотим задеплоить в tomcat. Так как у нас всего одно приложение, которое к тому же уже находится в секции Configured, то мы просто жмем на Finish:

addting_tomcat6

После того как мы нажмем на Finish эклипс собирет и запусти вэб приложение в контейнере tomcat. Введите в адресной строке эклипса или вэб браузера адрес: http://localhost:8080/cxf/rest/test-service/test и если в браузере отобразиться текст test CXF Servlet, то сборка и запуска приложения прошли успешно, с чем поздравляю.

addting_tomcat7

Заключение

http://localhost:8080/cxf/rest/test-service/test
Весь проект можно взять по этой ссылке

Линки

https://www.youtube.com/watch?v=YeC7XQho-O0 — you tube
http://www.mkyong.com/maven/how-to-create-a-web-application-project-with-maven — How to create a Web Application Project with Maven
http://www.apache-maven.ru/webapp.html — как создать web приложение с помощью maven

Поделиться в социальных сетях

Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс