410013796724260
• Webmoney
R335386147728
Z369087728698
Примеры проектов mavenНа странице рассматриваются примеры использования maven для создания разнотипных проектов :
Подробное описание maven приведено на странице Автоматизация сборки проекта. Консольное приложение maven проект carouselДля создания простейшего maven-проекта используем архетип maven-archetype-quickstart и выполним команду «mvn archetype:generate» со следующими опциями : mvn archetype:generate -DgroupId=ru.carousel -DartifactId=carousel -Dversion=1.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart Для наглядности опции «-D» команды mvn archetype:generate разнесены по строкам. Их следует разместить в одной строке. Проект (artifactId) назовем carousel. Если все опции «-D» определены, то выполнение цели archetype:generate попросит Вас только подтвердить введенные данные, в противном случае надо будет отвечать на вопросы и вводить данные в интерактивном режиме. В заключении подтвердите ввод значением Y и нажмите Enter, или просто нажмите Enter. В результате в той же директории, откуда запущена команда, maven создаст проект следующей архитектуры : Следует отметить, что maven не создал директорию target. Эта директория будет создаваться на этапе сборки проекта. При очистке проекта командой 'mvn clean' в поддиректории target будут удалены все файлы. В конечных директориях было создано 2 файла : App.java и AppTest.java Листинг файла описания проекта 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>ru.carousel</groupId> <artifactId>carousel</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>carousel</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project> В проектный файл pom.xml включен только раздел описания и раздел зависимостей, в который, на начальном этапе, входит только зависимость библиотеки тестирования JUnit. Тег packaging указывает на результирующий тип файла, который maven должен создать при исполнении цели package. Было использовано значение по-умолчанию jar. Внесем небольшие изменения в проект. Добавим еще один файл AppBean.java, который будем вызывать из файла App.java. Листинг файла AppBean.javapackage ru.carousel; public class AppBean { private String text; public AppBean(final String text) { this.text = text; } public String sayHello() { return "Hello, " + text; } } Листинг файла App.javapackage ru.carousel; public class App { public static void main( String[] args ) { System.out.println(new AppBean("Maven").sayHello()); } } Также внесем изменения в файл AppTest.java, добавлением теста проверки метода sayHello класса AppBean.java. Листинг файла AppTest.javapackage ru.carousel; import org.junit.Assert; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class AppTest extends TestCase { public AppTest( String testName ){ super( testName ); } public static Test suite(){ return new TestSuite( AppTest.class ); } public void testApp(){ assertTrue( true ); } public void testAssert() { String message = new AppBean("Maven 2").sayHello(); Assert.assertEquals("Test Hello Machine", "Hello, Maven 2", message); } } Теперь наш проект готов к выполнению первых команд maven. Для этого необходимо «зайти» в директорию проекта carousel и выполнить в командной строке определенные команды maven :
При выполнении любой команды maven представит в консоли подробную информацию. К примеру при выполнении команды сборки проекта mvn jar:jar в консоль будет выведено следующее сообщение : E:\maven.projects\carousel>mvn jar:jar [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building carousel 1.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-jar-plugin:3.0.2:jar (default-cli) @ carousel --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.560 s [INFO] Finished at: 2016-05-17T20:49:19+04:00 [INFO] Final Memory: 5M/15M [INFO] ------------------------------------------------------------------------ Здесь следует отметить, что в файле pom.xml для тестирования определена библиотека JUnit версии 3.8.1. Чтобы подключить более новую версию с дополнительными возможностями, о которых рассказано на странице JUnit тестирование, необходимо просто поменять значение <version> : <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> При выполнении очередного теста maven «закачает» в локальный репозиторий на компьютере новую версию JUnit. Файл манифест MANIFEST.MFСоздаваемая сборка проекта не является исполняемой, поскольку в файле манифеста не определен основной класс со статическим main методом. Поэтому стартовать нашу сборку мы не можем. Чтобы исправить эту ситуацию необходимо включить в pom.xml секцию <build>, в которой указать параметр <manifest> : <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>ru.carousel.App</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> При очередной сборке в файл-манифест MANIFEST.MF maven вставит следующую строку : Main-Class: ru.carousel.App Чтобы вставить в проект свой файл MANIFEST.MF, который располагается, к примеру, в директории src/main/resources/META-INF, можно использовать следующий код секции build : <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifestFile> src/main/resources/META-INF/MANIFEST.MF </manifestFile> </archive> </configuration> </plugin> </plugins> </build> Старт проектаПроект собирается по команде «mvn package» в директории target виде исполняемого файла carousel-1.0-SNAPSHOT.jar. Для старта проекта можно использовать следующие команды : // Запуск проекта с указанием в CLASSPATH (опция -cp) main класса java -cp carousel-1.0-SNAPSHOT.jar ru.carousel.App // Запуск jar проекта java -jar carousel-1.0-SNAPSHOT.jar Проект с графическим интерфесом библиотеки SWTРассмотрим простенький проект swit, создающий графический интерфейс и включающий внешнюю библиотеку SWT в виде jar-файлов. В проект включим 2 файла : MessageWindow.java и MessageWindowTest.java. Чтобы не засорять контент страницы информацией, не имеющей практического отношения к maven, листинги классов представлять не буду, приведу лишь скриншоты страниц, которыt они должны создать. Исходные коды классов входят в пакет примеров, которые можно скачать. Приложение при старте класса MessageWindowTest.java открывает небольшое окно, из которого можно открыть диалоговое окно MessageWindow.java. Создание maven проекта switДля создания проекта swit выполним команду «mvn archetype:generate» со следующими опциями : mvn archetype:generate -DgroupId=ru.swit -DartifactId=swit -Dversion=1.0 -DarchetypeArtifactId=maven-archetype-quickstart Не забывайте, что «-D» команды mvn archetype:generate разнесены по строкам только для наглядности. Структура проекта точно такая же, как и у предыдущего проекта carousel. Из создавшего проекта удалим файлы App.java, AppBean.java, AppTest.java, и вместо них в директории swit/src/main/java/ru/swit разместим наши 2 файла MessageWindow.java и MessageWindowTest.java. Несмотря на простоту данного приложения, для разработки и отладки был использован IDE Eclipse, который подсказал, какие библиотеки нам потребуются. Осталось только описать их зависимости в нашем pom.xml файле. Для того, чтобы создать графический интерфейс с использованием библиотеки SWT нам потребуются следующие jar-библиотеки :
Здесь следует отметить, что при описании зависимостей dependencies потребуется указать ряд GAV параметров groupId, artifactId, version для каждой jar-библиотеки. Если в одном из параметров ошибиться, то maven может не найти подходящую библиотеку и «выкинет» исключение. Если же он найдет что-нибудь «достойное», то закачает в локальный репозиторий. Чтобы не упражняться лишний раз в компиляции и поиске требуемых версий в репозиториях maven'a, сразу загрузим в локальный репозиторий требуемые библиотеки. Для того, чтобы занести jar-библиотеку в локальный репозиторий необходимо выполнить команду mvn install:install-file. В качестве параметров необходимо указать :
Выполним следующие скрипты (не забывайте, что команда maven должна быть однострочной). mvn install:install-file -Dfile=org.eclipse.swt.win32.win32.x86_3.7.1.v3738a.jar -DgroupId=org.eclipse.swt.win32.win32.x86 -DartifactId=org.eclipse.swt.win32.win32.x86 -Dversion=3.7.1.v3738 -Dpackaging=jar mvn install:install-file -Dfile=org.eclipse.core.runtime_3.7.0.v20110110.jar -DgroupId=org.eclipse.core.runtime -DartifactId=org.eclipse.core.runtime -Dversion=3.7.0.v20110110 -Dpackaging=jar mvn install:install-file -Dfile=org.eclipse.core.commands_3.6.0.I20110111-0800.jar -DgroupId=org.eclipse.core.commands -DartifactId=org.eclipse.core.commands -Dversion=3.6.0.I20110111-0800 -Dpackaging=jar mvn install:install-file -Dfile=org.eclipse.equinox.common_3.6.0.v20110523.jar -DgroupId=org.eclipse.equinox.common -DartifactId=org.eclipse.equinox.common -Dversion=3.6.0.v20110523 -Dpackaging=jar mvn install:install-file -Dfile=org.eclipse.jface_3.5.2.M20100120-0800.jar -DgroupId=org.eclipse.jface -DartifactId=org.eclipse.jface -Dversion=3.5.2.M20100120-0800 -Dpackaging=jar После выполнения данных команд можно заглянуть в локальный репозиторий и убедиться, что всё на месте. Примечание: библиотеки были взяты из приложения Eclipse. В исходниках их можно найти в директории swit/lib. Теперь осталось только поправить наш pom.xml файл, чтобы сборка заработала. Листинг pom.xml к проекту switВ описание проекта включаем свойство properties с кодировкой UTF-8 и подключаем зависимости dependencies внешних библиотек SWT. Для сборки проекта используется плагин maven-assembly-plugin, с включением всех зависимостей в сборку проекта. Подробное описание плагина maven-assembly-plugin можно найти на сайте Apache Maven Assembly. <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>ru.swit</groupId> <artifactId>swit</artifactId> <packaging>jar</packaging> <version>1.0</version> <name>swit</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.eclipse.core.runtime</groupId> <artifactId>org.eclipse.core.runtime</artifactId> <version>3.7.0.v20110110</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.eclipse.core.commands</groupId> <artifactId>org.eclipse.core.commands</artifactId> <version>3.6.0.I20110111-0800</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.eclipse.equinox.common</groupId> <artifactId>org.eclipse.equinox.common</artifactId> <version>3.6.0.v20110523</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.eclipse.jface</groupId> <artifactId>org.eclipse.jface</artifactId> <version>3.5.2.M20100120-0800</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.eclipse.swt.win32.win32.x86</groupId> <artifactId>org.eclipse.swt.win32.win32.x86</artifactId> <version>3.7.1.v3738</version> <scope>compile</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.6</version> <configuration> <finalName>${project.build.finalName}</finalName> <appendAssemblyId>false</appendAssemblyId> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>ru.swit.MessageWindowTest</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project> Для сборки проекта выполняем команду mvn package и проверяем директорию target, где должен располагаться исполняемый файл swit-1.0.jar. При двойном нажатии левой клавишей мыши на нем, он должен запуститься. Web приложение с использованием сервлетаДля создания maven проекта для Web приложения используем архетип «maven-archetype-webapp» и в командной строке выполним команду «mvn archetype:generate» со следующими опциями: mvn archetype:generate -DgroupId=ru.webapp -DartifactId=webapp -Dversion=1.0 -DarchetypeArtifactId=maven-archetype-webapp Не забывайте, что команда должна быть однострочной. Здесь она разнесена по строкам опций для наглядности. При выполнении данной команды maven выведет следующую информацию и попросит подтверждения. >mvn archetype:generate -DgroupId=ru.webapp \ -DartifactId=webapp \ -Dversion=1.0 -DarchetypeArtifactId=maven-archetype-webapp [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------ [INFO] Building Maven Stub Project (No POM) 1 [INFO] ------------------------------------------------------------------ [INFO] [INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) > \ generate-sources @ standalone-pom >>> [INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) < \ generate-sources @ standalone-pom <<< [INFO] [INFO] --- maven-archetype-plugin:2.4:generate (default-cli) @ \ standalone-pom --- [INFO] Generating project in Interactive mode [INFO] Using property: groupId = ru.webapp [INFO] Using property: artifactId = webapp [INFO] Using property: version = 1.0 [INFO] Using property: package = ru.webapp Confirm properties configuration: groupId: ru.webapp artifactId: webapp version: 1.0 package: ru.webapp Y: : y Останется только согласиться и нажать ENTER, после чего maven представит сводную информацию по созданному проекту : [INFO] ------------------------------------------------------------------ [INFO] Using following parameters for creating project from \ Old (1.x) Archetype: maven-archetype-webapp:1.0 [INFO] ------------------------------------------------------------------ [INFO] Parameter: groupId, Value: ru.webapp [INFO] Parameter: packageName, Value: ru.webapp [INFO] Parameter: package, Value: ru.webapp [INFO] Parameter: artifactId, Value: webapp [INFO] Parameter: basedir, Value: E:\maven.projects [INFO] Parameter: version, Value: 1.0 [INFO] project created from Old (1.x) Archetype in dir: \ E:\maven.projects\webapp [INFO] ------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------ [INFO] Total time: 6.950 s [INFO] Finished at: 2016-09-25T12:52:35+04:00 [INFO] Final Memory: 10M/47M [INFO] ------------------------------------------------------------------------ Проект создан, но он очень «бедненький» в плане свойств и наглядности. Включает только проектный файл pom.xml, дескриптор приложения web, и страницу index.jsp. Если его собрать командой mvn package, то в директории target будет создан файл webapp.war, который можно размещать в сервере приложений типа Tomcat, JBoss и т.п. Мы усложним немного задачу - импортируем проект в Eclipse и подключим сервлет HelloWorld.java со страницы Пример сервлета, hello. Для импортирования maven проекта в Eclipse должен быть установлен соответствующий плагин. Вопрос инсталляции плагина maven в Eclipse рассмотрен на отдельной странице (в разработке). В IDE Eclipse выбираем импорт существующего maven проекта, как это представлено на следующем скриншоте. На следующем шаге указываем директорию, где располагается проект. Структура импортированного проекта представлена на следующем скриншоте. Здесь следует отметить, что на скриншоте мы видим сервлет HelloWorld.java в директории src/main/java/servlets. Изначально в проекте webapp директория java/servlets и сам сервлет, как это было сказано выше, отсутствовали. Листинг сервлета Helloworld.javapackage servlets; import java.io.IOException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import javax.servlet.ServletConfig; import javax.servlet.ServletException; public class HelloWorld extends HttpServlet { private static final long serialVersionUID = 1L; private ServletConfig config; @Override public void init (ServletConfig config) throws ServletException { this.config = config; } @Override public void destroy() {} @Override public ServletConfig getServletConfig() { return config; } @Override public String getServletInfo() { return "A Simple Servlet"; } public void service (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType( "text/html" ); String text = "<!DOCTYPE html PUBLIC " + "\"-//W3C//DTD HTML 4.01 Transitional//EN\" " + "\"http://www.w3.org/TR/html4/loose.dtd\"> " + "<html><head>" + "<meta http-equiv=\"Content-Type\" " + "content=\"text/html; charset=UTF-8\"> " + "<title>Пример сервлета!</title>" + "</head>" + "<body>" + "<h1>Здравствуй, %s %s!</h1>" + "</body></html>"; text = String.format(text, config.getInitParameter("name"), config.getInitParameter("mname")); OutputStream outStream = response.getOutputStream(); outStream.write(text.getBytes("UTF-8")); outStream.flush(); outStream.close(); } } Сервлет Helloworld.java извлекает из дескриптора web.xml два параметра и подставляет их значения в шаблон ответа text. Обратите внимание на кодировку отправляемого браузеру ответа - UTF-8. Это нам еще понадобиться для проектного файла pom.xml. Листинг 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>Archetype Created Web Application</display-name> <servlet> <servlet-name>simpleServlet</servlet-name> <servlet-class>servlets.HelloWorld</servlet-class> <init-param> <param-name>name</param-name> <param-value>Остап</param-value> </init-param> <init-param> <param-name>mname</param-name> <param-value>Ибрагимович</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>simpleServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app> В дескриптор приложения web.xml добавлено описание сервлета servlets.HelloWorld с двумя инициализационными параметрами. Листинг страницы index.jspСтраница index.jsp осталась без изменения. <html> <body> <h2>Hello World!</h2> </body> </html> Листинг проектного файла 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>ru.webapp</groupId> <artifactId>webapp</artifactId> <packaging>war</packaging> <version>1.0</version> <name>webapp Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>compile</scope> </dependency> </dependencies> <build> <finalName>webapp</finalName> </build> </project> В проектный файл была добавлена секция свойств с кодировкой UTF-8 и зависимость javax.servlet. Остальное осталось без изменений. Теперь можно сказать, что проект готов к работе. Для этого сделаем сборку проекта командой «mvn package -Dmaven.test.skip=true». В консоли maven выведет сообщение : >mvn package -Dmaven.test.skip=true [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------ [INFO] Building webapp Maven Webapp 1.0 [INFO] ------------------------------------------------------------------ [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) \ @ webapp --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ webapp - [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to E:\maven.projects\webapp\target\classes [INFO] [INFO] --- maven-resources-plugin:2.6:testResources \ (default-testResources) @ webapp --- [INFO] Not copying test resources [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile \ (default-testCompile) @ webapp --- [INFO] Not compiling test sources [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ webapp --- [INFO] Tests are skipped. [INFO] [INFO] --- maven-war-plugin:2.2:war (default-war) @ webapp --- [INFO] Packaging webapp [INFO] Assembling webapp [webapp] in \ [E:\maven.projects\webapp\target\webapp] [INFO] Processing war project [INFO] Copying webapp resources \ [E:\maven.projects\webapp\src\main\webapp] [INFO] Webapp assembled in [53 msecs] [INFO] Building war: E:\maven.projects\webapp\target\webapp.war [INFO] WEB-INF\web.xml already added, skipping [INFO] ------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------ [INFO] Total time: 3.420 s [INFO] Finished at: 2016-09-25T16:36:28+04:00 [INFO] Final Memory: 11M/27M [INFO] ------------------------------------------------------------------ Сборка проекта располагается в директории target : Старт приложенияПосле того, как сборка была создана, проект можно запускать стандартным для Eclipse способом или выложить сборку на сервер приложений. Для вызова сервлета был использован url «localhost:8080/webapp/hello». Текст представлен правильно, т.е. кодировка сработала корректно. Скачать примерыРассмотренные примеры использования maven для сборки проектов можно скачать здесь (7.06 Мб). |