но вот о шубе речь не шла.
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 Мб). |