Tuesday 26 August 2014

Java EE - что это, ее неполное составляющее.

Java EE


В нынешние времена считается что та система хороша, которая надежна как топор, быстра как молния, независима как ветер, проста как валенок и продуктивна в разработке как паровоз. Java EE в свою очередь, выполняет достаточно много из таких требований, конечно с определенной корректировкой на реальность. Реальность такова что больше и больше энтерпрайзов начинают сотрудничать с друг другом, так-как понимают что вместе можно слепить больше и продать быстрее - это как единый организм с независимыми частями, каждая выполняющая свою функцию и пользующаяся плодами других, главное тут конечно не путать кто чем должен заниматься. Так вот все это, предприятия будут стараться поддерживать на уровне ПО. Тут Java EE хороша как раз своей мобильностью, сетью готовых разработок (API), полноценной поддержкой транзакций во многих сферах подразделений, а так-же набором готовых продуктов для обеспечения безопасности и надежности. Скорость конечно не самая лучшая, тем не менее нужных результатов добиться в основном можно. Простота за счет постоянного стремительного развития ООП (объектно ориентированного программирования) в Java EE легко уже достигается, хоть и увеличилась информационная база значительно за последние годы. Разработка Java EE закреплена спецификациями, большинство, если не всё, из которых поддерживается разными серверами. На чем уж действительно можно сделать акцент, та это на том что разработка с Java EE действительно продуктивна и проста из за огромной базы функционала, который свободно можно внедрить, сконфигурировать и он будет взаимодействовать под эгидой ООП. В основном крупные системы многослойны и включают в себя кучу всего. Такой распорядок определяет эффективную организацию большого предприятия. Вот что примерно их себя представляет архитектура типичной Java EE системы.

Diagram of multitiered application structure, including client tier, web tier, business tier, and EIS tier.

Клиент, это пользователь с браузером. Связь может осуществляться через компьютер, телефон или любой инструмент располагающий каким-нибудь типом связи.

Java EE Server

Java EE сервер, состоит из множества частей, наиболее весомые это EJBs, они обычно используются для выполнения бизнес логики в так называемом business tier. А вот то что обеспечивает связь с клиентом через например http протокол, так это какой-нибудь фреймворк такой например как JSF, хотя это может быть и Struts и все что угодно; именуется этот слой как front end или Web tier. Главное что обычно есть хоть и небольшое и не всегда вполне ощущаемое разделение между web и business слоем. Зачастую business слой ответственен за подсоединение с базой данных (БД), хотя опять-же если нет особого разделения между web и business, то можно сказать что web так-же обеспечен возможностью соединения.

Web Tier

Этот слой состоит из страниц и технологий способных их обрабатывать. Это все то, что может обрабатываться Web контейнером (считается что Java EE сервер содержит в себе Web Container для этого слоя. Например раньше JBoss содержал в себе Tomcat, потом разработал свой модуль). Это могут быть HTML файлы с CSS и JavaScript. Используются так-же файлы типа JSP которые компилируются в сервлеты во время упаковки и к примеру XHTML которые просто обрабатываются и чью структуру держит кэш на сервере. То-есть все те внешние страницы с которыми работает клиент, хотя динамичный контент может исходить из БД или еще откуда-то проходя через business tier(опять-же если есть такой явно выраженный) и попадая на страницы. Если работа с динамичным контентом необходима (в основном это так) то запросы проходят через сервлеты, которые являются классами ответственными за обработку HTTP GET/POST запросов. 


Diagram of Java EE APIs in the web container

 JavaServer Faces
Фреймворк для разработки веб приложений, одно из преимуществ которого является свободное разделение между UI и поведением программы. Он полностью интегрирован со многими ключевыми компонентами Java EE, такими к примеру как EJB (Enterprise Java Beans), JTA (Java Transaction API), JPA (Java Persistence). Содержит API для отражения компонентов и руководства их состоянием. А так-же обеспечивает: управление событиями (), проверку данных, конвертацию данных, определение навигации запросов, поддержку интернационализации, возможность использовать разные faces фреймворки (такие как IceFaces).

JSR299, JSR330
CDI (Contexts and Dependency Injection). Целый спектр возможностей по внедрению зависимостей, причем независимого в поведении и определении компонентов. Придает действительно объектно ориентированный характер взаимоотношению объектов, выводя его на новый уровень за-счет @annotation в сфере  конфигураций, деклараций и квалификаторов, а так-же удобной и полной интеграции с JSF, так как все бины попадают в зону видимости UI компонентов, будь то POJO или EJB 3.1. Акшоном (Action class) может быть все что угодно практически, без лишних деклараций.

ManagedBeans
Легкие бины, по сущности POJO объекты, разработанные как бины JSF, которые обладают доступом к таким сервисам как внедрение зависимостей и interception. В отличие от CDI, они легче но распространяются только в сфере влияния JSF, тогда когда CDI пользуется полной свободы размещения по всему что охватывает собой Java EE.

Bean Validation
Возможность указывать правила проверки JavaBeans задействованных в цикле JSF в виде анотаций.

EJB Lite
Упрощенная спецификация EJB (EJB Lite), которая предусматривает размещение EJB lite в Web Container, без элементов: MDB, EJB2.x, Remote Interface, JAX-WS, JAX-RPC, Timer Service, Asynchronous Session Bean, RMI-IIOP. Тем не менее включает в себя все остальное доступное EJB.

EL
Expression Language, позволяющий отображать значения, вызывать методы и производить другого рода манипуляции Beans. Зачастую используется в UI компонентах (JSP, XHTML), но может и использоваться в самих классах, для обнаружения Beans в контексте (session, request, и.т.д.).

JavaMail
API для email операций.

JSP
Страницы содержащие статический и динамичный контент обрабатываемый сервером. Во время deployment, JSP странницы сервер компилирует в Servlet-ы. Удобство, по крайней мере так было задумано изначально, JPS страниц заключается в том что в отличие о сервлетов существует разделение UI от бизнес логики хоть и не в полной степени, так как в JSP можно писать scriplet-ы (Java код) сопряженные с HTML контентом, некий гибрид но все-же лучше чем просто сервлет с HTML кодом в String-ах.

Connectors (JCA - Java Connector Architecture)
Сеть API для разработки подсоединений к EIS (Entreprise Information System) являющимися источниками информации или поставщиками услуг, к примеру БД или AS/400 mainframe.

Java Persistence (JPA)
Фреймворк отображающий реляционную СУБД в сущностях и на объектно ориентированной основе. Из за несостыковки реляционной и объектно ориентированной моделей, фреймворк предоставляет возможности правильно оценить и реализовать сущности в Java относительно структуры БД, за счет этого сущности приобретают гибкость и простоту проектирования и реализации. JPA помимо стратегий отображения включает в себя инструменты для руководства транзакциями и жизненными циклами сущностей в разных контекстах, а так-же язык JPQL - упрощенный SQL преобразованный на объектно ориентированную основу.

JMS (Java Message Service)
Механизм обеспечивающий работу с месседжами (отправка/получение). Широко используется для разработки независимых, распределенных и асинхронных процессов. Может служить оберточным сервисом для таких систем как IBM MQ.

Web Services
Целый ряд API для разработки Web Services как по стандарту SOAP c WSLD интерфейсом, так и REST (Representational State Transfer), где запрос отправляется в виде в формате GET или POST. Так-же поддерживаются протоколы CORBA и RPC.  

JACC (Java Authorization Contract for Containers)
Контракт определяющий систему авторизации между контейнером (сервером) и самим разработчиком таких систем. По сути дела, это внутренний механизм авторизации сервисов в Java EE.

JASPIC (Java Authentication Service Provider Interface for Containers)
Контракт определяющий систему аутентификации в Java EE. Зачастую, аутентификации разработана индивидуально каждым производителем. В данном случае была выпущена спецификация, правда пока широко не используется так как толком не доработана и выполнена в стиле J2EE 1.4.

JAX-RS
API для разработки RESTful Web Services.

JAX-WS
API для разработки Web Services на основе SOAP и WSDL.

JAX-RPC
API для разработки Web Services через протокол RPC.

SAAJ
API низкого уровня для работы с SOAP Web Services, а так-же позволяет прикреплять приложения к месседжам SOAP.

Business Tier

Здесь сфера деятельности так называемого EJB container-а. Большинство функционала продиктованного требованиями организации под название бизнес логика (business logic) выполняется здесь. Так-же здесь осуществляется соединение с БД. EJB container берет свое название из спецификации о EJB beans которые он способен поддерживать. EJB - это объект оснащенный сетью функций, сервисов предоставляемых контейнером. Такие функции как к примеру поддержка транзакций компонующих процессы, безопасность, потокобезопасность, пулинг (резерв бинов), dependency injection (внедрения зависимых компонентов - DI), контроль над циклом жизни бина и многое другое. В общем EJB обладают мощным потенциалом, достаточным для выполнения сложных операций при этом сохраняя свою простоту и гибкость в разработки и эксплуатации. 

Diagram of Java EE APIs in the EJB container

EJB (Enterprise Java Beans)
Объекты оснащенные рядом сервисов позволяющие быстро удобно и продуктивно разрабатывать и выполнять бизнес решения на сервере. Сервисы включают в себя руководство транзакциями, доступ к ресурсам, CDI (см. выше), пулинг, поддержка параллелизма, реализации Web Services и выполнять роль бинов JSF. Существуют разные типы бинов отображающие жизненный цикл предусмотренный бизнес логикой и отвечающий всем требованием выполнения обеспечивая необходимые ресурсы. Так-же предусмотрены решения разделенного асинхронного процессинга за счет MDB (Message Driven Bean) с использованием JMS (Java Message Service). EJB один из самых ключевых функционалов в Java EE, со многими прочими преимуществами, но это на отдельную тему. 

Sunday 10 August 2014

Weblogic JSF 2 tutorial

Lets create a very simple Web app (WAR) using JSF 2 and drop it on Weblogic.

Prerequisites:

  You would need a weblogic instance installed and have a domain created. If you do not have one, you can download the server from http://www.oracle.com/technetwork/middleware/weblogic/downloads/wls-main-097127.html. Then you would need to create a domain, this can be done from Configuration Wizard, where you would choose to create a new domain.

  I am using eclipse for this tutorial, with a simple java project (the reason why i choose not to use the web app project type is that it will give you a better sence of what the application is made of).
My weblogic is instaled in the following directory, this is the directory i will be refering throughout the tutorial:

C:\Oracle\Middleware\Oracle_Home

The directory of the created domain in weblogic i have as:


C:\Oracle\Middleware\Oracle_Home\user_projects\domains\technokon

Install JSF 2 libraries in Weblogic

  First thing we need to do is install the jsf2 library on weblogic (this isn't something you would have to do on JBoss or Glassfish servers for example).
  To do this you need to start-up your weblogic domain, so let's do that and go through the process of installing the library. To start the domain i will launch this file:


startWebLogic.cmd

which is right in the domain directory. You would know that the server is running, when you see something like the following in the cmd window log, the the server is using:

<Aug 7, 2014 8:05:22 PM EDT> <Notice> <WebLogicServer> <BEA-000331> <Started the
 WebLogic Server Administration Server "AdminServer" for domain "technokon" running in development mode.>
<Aug 7, 2014 8:05:22 PM EDT> <Notice> <WebLogicServer> <BEA-000360> <The server started in RUNNING mode.>
<Aug 7, 2014 8:05:22 PM EDT> <Notice> <WebLogicServer> <BEA-000365> <Server state changed to RUNNING.>

Now navigate your browser to:

http://localhost:7001/console

and login to console. Note that i am using the default port 7001, that was configured during the domain creation process.

  Now, on the left menu choose:

Deployments, then click on the  button. Now, navigate to the directory where the jfs-2.0.war is, which i have at:


C:\Oracle\Middleware\Oracle_Home\wlserver\common\deployable-libraries

You will see a file there called:

jsf-2.0.war

  Pick this file and click on the   button. Then on the next page pick Install this deployment as a library.
And click next again on the following 2 pages and  after, this will take you to the configuration page.
Now on this page, set the Restart may be required. Deployment Order: to 99 (default is 100), so it is deployed before other auto-deployable apps. adn click  .

  Now lets move over to the project itself.


Java Project

Start your eclipse and in the workspace create a Java project, I called mine JSFTest.

For this tutorial I am usign Ant to help me, with the following build file that I placed in the root of my java project:

<?xml version="1.0" encoding="UTF-8"?>
<!-- ====================================================================== 
     Aug 7, 2014 3:09:10 PM                                                        

     JSF Test    
     JSF 2 Test application
                   
     iakoupov                                                                
     ====================================================================== -->



<project name="JSF Test" default="build">

 <description>
            JSF 2 Test application
    </description>

 <property name="deploy.dir" value="C:\Oracle\Middleware\Oracle_Home\user_projects\domains\technokon\autodeploy\Test.war" />

 <!-- ================================= 
          target: build              
         ================================= -->
 <target name="build" depends="compile" description="JSF 2 Test application">

  <war destfile="${deploy.dir}" webxml="WebContent\WEB-INF\web.xml">
   <fileset dir="WebContent" includes="*.xhtml" />
   <webinf dir="WebContent\WEB-INF">
   </webinf>
  </war>

 </target>

 <!-- - - - - - - - - - - - - - - - - - 
          target: compile                      
         - - - - - - - - - - - - - - - - - -->
 <path id="jsf2.lib">
  <fileset dir="WebContent\WEB-INF\lib" includes="*.jar" />
 </path>
 <target name="compile">

  <delete dir="WebContent\WEB-INF\classes" />

  <copy todir="WebContent\WEB-INF\classes\resources" overwrite="true">
   <fileset dir="src\resources" includes="**/*.properties" />
  </copy>

  <javac srcdir="src" destdir="WebContent\WEB-INF\classes" includeantruntime="true" classpathref="jsf2.lib" debug="on" />
 </target>

</project>

In that file you would need to change the value of the deploy.dir property so it relates to the location of your domain.

Now lets create other folders in the java project that will compose our web app.

1) Create a folder called WebContent in the root of the project. In there create a folder called WEB-INF.
2) In the WEB-INF folder create 2 folders: classes and lib.
In the lib directory, copy following 2 jar files and add them to the project classpath:


C:\Oracle\Middleware\Oracle_Home\wlserver\modules\javax.enterprise.inject_1.2
C:\Oracle\Middleware\Oracle_Home\wlserver\modules\javax.inject-1.jar


3) Under the src folder, create a package called resources.

3) Now lets copy following files to resources package:  application.properties.

application.properties

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# -- welcome --
welcomeTitle=JSF Blank Application

welcomeHeading=Welcome!

welcomeMessage=This is a JSF blank application. \
 You can find the application.properties file with this message in the src/resources folder.
 
titleStandardNumberConverter = Standard converters for numbers - format numbers
titleStandardDateConverter = Standard converters for date and time
titleCustomCarConverter = Custom car converter
titleCustomDateConverter = Custom date converter


4) To the WEB-INF folder copy the following files: web.xmlweblogic.xml, beans.xml,
faces-config.xml.

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>Test</display-name>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
   <welcome-file>index.xhtml</welcome-file>
  </welcome-file-list> 
  
  
</web-app>

weblogic.xml

<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">
    <wls:weblogic-version>12.1.3</wls:weblogic-version>
    <wls:context-root>Test</wls:context-root>
</wls:weblogic-web-app>

This file is required by weblogic. In there modules are specified, such as ear, war, ejb-jar files.

beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee">
 <scan>
  <exclude name="com.chapter1.*" />
 </scan>
</beans>

Notice the exclude tag, that tells the container not to scan for beans in the pointed-out package.

faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
 <application>
  <message-bundle>resources.application</message-bundle>
  <locale-config>
   <default-locale>en</default-locale>
  </locale-config>
 </application>

</faces-config>

Notice how compact the file is, since there is no mapping declarations made. This is due to new standard of convenction over configuration (COC) and beans may be declared with annotations as you will see later. This file however still needs to be on the classpath.

5) To the WebContent folder, copy 2 xhtml files that we use for this example: index.xhtmllogin.xhtml.

index.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:ui="http://java.sun.com/jsf/facelets"
 xmlns:h="http://java.sun.com/jsf/html"
 xmlns:f="http://java.sun.com/jsf/core">

<f:loadBundle basename="resources.application" var="msg" />

<head>
<title><h:outputText value="#{msg.welcomeTitle}" /></title>
</head>

<body>
 <h3>
  <h:outputText value="#{msg.welcomeHeading}" />
 </h3>
 <p>
  <h:outputText value="#{msg.welcomeMessage}" />
 </p>

 <br />
 <h:link outcome="login" value="Login" />

</body>
</html>


login.xhtml


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:ui="http://java.sun.com/jsf/facelets"
 xmlns:h="http://java.sun.com/jsf/html"
 xmlns:f="http://java.sun.com/jsf/core">

<f:loadBundle basename="resources.application" var="msg" />

<head>
<title><h:outputText value="#{msg.welcomeTitle}" /></title>
</head>

<body>
 <f:view>
  <h:form id="loginForm">
   <h:panelGrid columns="2" rendered="#{!login.loggedIn}">
    <h:outputLabel for="username">Username:</h:outputLabel>
    <h:inputText id="username" value="#{credentials.username}" />
    <h:outputLabel for="password">Password:</h:outputLabel>
    <h:inputSecret id="password" value="#{credentials.password}" />

   </h:panelGrid>

   <h:commandButton value="Login" action="#{login.login}"
    rendered="#{!login.loggedIn}" />
   <h:commandButton value="Logout" action="#{login.logout}"
    rendered="#{login.loggedIn}" />

  </h:form>
 </f:view>
</body>
</html>

6) Create a package under src folder in eclipse and create Login, User and Credentials classes in there.

Login.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.technokon.bean;

import java.io.Serializable;

import javax.enterprise.inject.Model;
import javax.enterprise.inject.Produces;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;

@SessionScoped
@Model
public class Login implements Serializable {
 private static final long serialVersionUID = -7665912439280494601L;
 
 @Inject
 private Credentials credentials;
 
 private User user;
 
 public void login() {
  // DB
  if (credentials.getUsername().equalsIgnoreCase("ADMIN")
    && credentials.getPassword().equals("password")) {
   user = new User();
   user.setUsername(credentials.getUsername());
   user.setPassword(credentials.getPassword());
  }
 }
 
 public void logout() {
  user = null;
 }
 
 public boolean isLoggedIn () {
  return user != null;
 }
 
 @Produces
 User getCurrentUser() throws Exception {
  if (user == null) {
   throw new Exception("Not logged in");
  } else {
   return user;
  }
 }

}

User.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.technokon.bean;

import javax.enterprise.inject.Model;

@Model
public class User {
 
 private String username;
 
 private String password;
 
 private String firstName;
 
 private String lastName;

 public String getUsername() {
  return username;
 }

 public void setUsername(String username) {
  this.username = username;
 }

 public String getPassword() {
  return password;
 }

 public void setPassword(String password) {
  this.password = password;
 }

 public String getFirstName() {
  return firstName;
 }

 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }

 public String getLastName() {
  return lastName;
 }

 public void setLastName(String lastName) {
  this.lastName = lastName;
 }
 
 

}

Credentials.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.technokon.bean;

import javax.enterprise.inject.Model;

@Model
public class Credentials {
 
 private String username;
 
 private String password;

 public String getUsername() {
  return username;
 }

 public void setUsername(String username) {
  this.username = username;
 }

 public String getPassword() {
  return password;
 }

 public void setPassword(String password) {
  this.password = password;
 }
 
 
}

Sunday 27 July 2014

Debug Weblogic in Eclipse

Вообще то существует Oracle plugin для эклипса, но дело в том что мне он весь ни к чему. А весь он жутко тормозит IDE. Так как все проекты в основном подкреплены скриптами, ведь в любом случае надеяться на IDE как на инструмент который скомпилирует, запакует и развернет проект - нельзя, к сожалению опыт показывает что айдиишки ломаются по самым разным причинам, из за какого нибудь плагина который и нанесет ему урон). Надежную структуру проекту придает скрипт, он дает ему силу, возможность оказывать действие и пользу, как каркас плотно связывающий бесполезные доски корабля. Но если без философии, то вот как можно установить debugging и запуск Weblogic сервера из эклипса.

Запуск
1) Зайдите в созданную папку bin доменa и откройте файл startWebLogic.cmd - это на Windows. Вот этот файл:

C:\Oracle\Middleware\Oracle_Home\user_projects\domains\technokon\bin\startWebLogic.cmd

2) Добавьте туда вот этот кусок:

@REM set debug options
set JAVA_OPTIONS=%JAVA_OPTIONS% -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n

Suspend=n означает что Debuger не будет ждать запуска listener с порта 8000.

Вот файл целиком:

@ECHO OFF

@REM WARNING: This file is created by the Configuration Wizard.
@REM Any changes to this script may be lost when adding extensions to this configuration.

SETLOCAL

@REM --- Start Functions ---

GOTO :ENDFUNCTIONS

:stopAll
 @REM We separate the stop commands into a function so we are able to use the trap command in Unix (calling a function) to stop these services
 if NOT "X%ALREADY_STOPPED%"=="X" (
  GOTO :EOF
 )
 @REM STOP DERBY (only if we started it)
 if "%DERBY_FLAG%"=="true" (
  echo Stopping Derby server...
  call "%WL_HOME%\common\derby\bin\stopNetworkServer.cmd"  >"%DOMAIN_HOME%\derbyShutdown.log" 2>&1 

  echo Derby server stopped.
 )

 set ALREADY_STOPPED=true
GOTO :EOF

:classCaching
 echo Class caching enabled...
 set JAVA_OPTIONS=%JAVA_OPTIONS% -Dlaunch.main.class=%SERVER_CLASS% -Dlaunch.class.path="%CLASSPATH%" -Dlaunch.complete=weblogic.store.internal.LockManagerImpl -cp %WL_HOME%\server\lib\pcl2.jar
 set SERVER_CLASS=com.oracle.classloader.launch.Launcher
GOTO :EOF


:ENDFUNCTIONS

@REM --- End Functions ---

@REM *************************************************************************
@REM This script is used to start WebLogic Server for this domain.
@REM 
@REM To create your own start script for your domain, you can initialize the
@REM environment by calling @USERDOMAINHOME\setDomainEnv.
@REM 
@REM setDomainEnv initializes or calls commEnv to initialize the following variables:
@REM 
@REM BEA_HOME       - The BEA home directory of your WebLogic installation.
@REM JAVA_HOME      - Location of the version of Java used to start WebLogic
@REM                  Server.
@REM JAVA_VENDOR    - Vendor of the JVM (i.e. BEA, HP, IBM, Sun, etc.)
@REM PATH           - JDK and WebLogic directories are added to system path.
@REM WEBLOGIC_CLASSPATH
@REM                - Classpath needed to start WebLogic Server.
@REM PATCH_CLASSPATH - Classpath used for patches
@REM PATCH_LIBPATH  - Library path used for patches
@REM PATCH_PATH     - Path used for patches
@REM WEBLOGIC_EXTENSION_DIRS - Extension dirs for WebLogic classpath patch
@REM JAVA_VM        - The java arg specifying the VM to run.  (i.e.
@REM                - server, -hotspot, etc.)
@REM USER_MEM_ARGS  - The variable to override the standard memory arguments
@REM                  passed to java.
@REM PRODUCTION_MODE - The variable that determines whether Weblogic Server is started in production mode.
@REM DERBY_HOME - Derby home directory.
@REM DERBY_CLASSPATH
@REM                - Classpath needed to start Derby.
@REM 
@REM Other variables used in this script include:
@REM SERVER_NAME    - Name of the weblogic server.
@REM JAVA_OPTIONS   - Java command-line options for running the server. (These
@REM                  will be tagged on to the end of the JAVA_VM and
@REM                  MEM_ARGS)
@REM SAVE_MEMORY    - Put server in a mode where it is frugal with memory, potentially sacrificing performance to do so.
@REM CLASS_CACHE    - Enable class caching of system classpath.
@REM PROXY_SETTINGS - These are tagged on to the end of the JAVA_OPTIONS. This variable is deprecated and should not
@REM                  be used. Instead use JAVA_OPTIONS
@REM 
@REM For additional information, refer to "Administering Server Startup and Shutdown for Oracle WebLogic Server"
@REM *************************************************************************

@REM Call setDomainEnv here.

set DOMAIN_HOME=C:\Oracle\Middleware\Oracle_Home\user_projects\domains\technokon
for %%i in ("%DOMAIN_HOME%") do set DOMAIN_HOME=%%~fsi

call "%DOMAIN_HOME%\bin\setDomainEnv.cmd" %*

set SAVE_JAVA_OPTIONS=%JAVA_OPTIONS%

set SAVE_CLASSPATH=%CLASSPATH%

@REM Start Derby

set DERBY_DEBUG_LEVEL=0

if "%DERBY_FLAG%"=="true" (
 call "%WL_HOME%\common\derby\bin\startNetworkServer.cmd"  >"%DOMAIN_HOME%\derby.log" 2>&1 

)

set JAVA_OPTIONS=%SAVE_JAVA_OPTIONS%

set SAVE_JAVA_OPTIONS=

set CLASSPATH=%SAVE_CLASSPATH%

set SAVE_CLASSPATH=

if "%PRODUCTION_MODE%"=="true" (
 set WLS_DISPLAY_MODE=Production
) else (
 set WLS_DISPLAY_MODE=Development
)

if NOT "%WLS_USER%"=="" (
 set JAVA_OPTIONS=%JAVA_OPTIONS% -Dweblogic.management.username=%WLS_USER%
)

if NOT "%WLS_PW%"=="" (
 set JAVA_OPTIONS=%JAVA_OPTIONS% -Dweblogic.management.password=%WLS_PW%
)

if NOT "%MEDREC_WEBLOGIC_CLASSPATH%"=="" (
 if NOT "%CLASSPATH%"=="" (
  set CLASSPATH=%CLASSPATH%;%MEDREC_WEBLOGIC_CLASSPATH%
 ) else (
  set CLASSPATH=%MEDREC_WEBLOGIC_CLASSPATH%
 )
)

@REM set debug options
set JAVA_OPTIONS=%JAVA_OPTIONS% -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n

echo .

echo .

echo JAVA Memory arguments: %MEM_ARGS%

echo .

echo CLASSPATH=%CLASSPATH%

echo .

echo PATH=%PATH%

echo .

echo ***************************************************

echo *  To start WebLogic Server, use a username and   *

echo *  password assigned to an admin-level user.  For *

echo *  server administration, use the WebLogic Server *

echo *  console at http:\\hostname:port\console        *

echo ***************************************************

@REM SAVE MEMORY

if exist %WL_HOME%\server\bin\saveMemory (
 call "%WL_HOME%\server\bin\saveMemory.cmd"
)

@REM CLASS CACHING

if "%CLASS_CACHE%"=="true" (
 CALL :classCaching
)

@REM START WEBLOGIC

echo starting weblogic with Java version:

%JAVA_HOME%\bin\java %JAVA_VM% -version

if "%WLS_REDIRECT_LOG%"=="" (
 echo Starting WLS with line:
 echo %JAVA_HOME%\bin\java %JAVA_VM% %MEM_ARGS% -Dweblogic.Name=%SERVER_NAME% -Djava.security.policy=%WLS_POLICY_FILE% %JAVA_OPTIONS% %PROXY_SETTINGS% %SERVER_CLASS%
 %JAVA_HOME%\bin\java %JAVA_VM% %MEM_ARGS% -Dweblogic.Name=%SERVER_NAME% -Djava.security.policy=%WLS_POLICY_FILE% %JAVA_OPTIONS% %PROXY_SETTINGS% %SERVER_CLASS%
) else (
 echo Redirecting output from WLS window to %WLS_REDIRECT_LOG%
 %JAVA_HOME%\bin\java %JAVA_VM% %MEM_ARGS% -Dweblogic.Name=%SERVER_NAME% -Djava.security.policy=%WLS_POLICY_FILE% %JAVA_OPTIONS% %PROXY_SETTINGS% %SERVER_CLASS%  >"%WLS_REDIRECT_LOG%" 2>&1 
)

CALL :stopAll

popd

@REM Exit this script only if we have been told to exit.

if "%doExitFlag%"=="true" (
 exit
)



ENDLOCAL

Файл этот используется для запуска сервера. Сохраните файл как нибудь в той-же папке, я свой назвал - startWebLogicInDebug.cmd

3) В эклипсе добавьте External tool configurations, для это-го идите в:

Run -> External Tools -> External Tools Configurations... 

Там создайте 2 конфигурации, для запуска и для стопа:





В Location укажите на файлы для запуска, это вот новый подготовленный файл, и файл для стопа, он в той-же директории.


 Debuggin
В эклипсе зайдите в:

Run -> Debug Configurations... 

А там:


Вот и все. Теперь в начале запускаем сервер, потом Debug. В Debug, в табе Source, вы можете указать проекты по которым желаете пройтись во время работы сервера.  

Sunday 20 July 2014

Учебное пособие по maven

Maven - это современный расширенный build tool.

Загрузите и установите Maven. На той же странице, вы найдете инструкции по установке, там где написано:

Installation Instructions



Теперь попробуем с ним поработать. Прошу учесть что последовательность действий я беру с книги Apache Maven 3 Cookbook. Итак, приступим-с. В директории, где у нас должны помещаться проекты, пишем:

PS C:\Users\Administrator> mvn archetype:generate
[INFO] Scanning for projects...
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.
pom
Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.p
om (4 KB at 8.1 KB/sec)
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/22/maven-plugins-22.pom
Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/22/maven-plugins-22.pom (13 KB at
 78.1 KB/sec)
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/21/maven-parent-21.pom
Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/maven-parent/21/maven-parent-21.pom (26 KB at 102.1 KB/
sec)
Downloading: http://repo.maven.apache.org/maven2/org/apache/apache/10/apache-10.pom
Downloaded: http://repo.maven.apache.org/maven2/org/apache/apache/10/apache-10.pom (15 KB at 81.2 KB/sec)
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.
jar
Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.j
ar (25 KB at 79.9 KB/sec)
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-install-plugin/2.4/maven-install-plugin-
2.4.pom
Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-install-plugin/2.4/maven-install-plugin-2
.4.pom (7 KB at 43.3 KB/sec)
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/23/maven-plugins-23.pom
Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-plugins/23/maven-plugins-23.pom (9 KB at
60.7 KB/sec)
...

Затем появится вопрос о выборе номера

Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 439:

Выбираем предлагаемый (нажимаем ввод)

Затем появляется вопрос о версии archetype, опять-же выбираем предлагаемый.

Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
Choose a number: 6:

 Затем идет запрос о groupId, пишем:

pe-quickstart-1.1.pom (2 KB at 10.1 KB/sec)
Define value for property 'groupId': : com.test.project

Затем artifactId, пишем:

Define value for property 'artifactId': : myProject

Затем идет запрос о версии проекта и подтверждении пакеджа. Нажимаем везде ввод и вод к чему в конце концов приводит процесс постройки:

Define value for property 'version':  1.0-SNAPSHOT: :
Define value for property 'package':  com.test.project: :
Confirm properties configuration:
groupId: com.test.project
artifactId: myProject
version: 1.0-SNAPSHOT
package: com.test.project
 Y: :
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: C:\Users\Administrator
[INFO] Parameter: package, Value: com.test.project
[INFO] Parameter: groupId, Value: com.test.project
[INFO] Parameter: artifactId, Value: myProject
[INFO] Parameter: packageName, Value: com.test.project
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: C:\Users\Administrator\myProject
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 29:20 min
[INFO] Finished at: 2014-07-20T13:27:06-04:00
[INFO] Final Memory: 10M/79M
[INFO] ------------------------------------------------------------------------
PS C:\Users\Administrator>

Вот что для нас сгенерировал maven:

PS C:\Users\Administrator> tree /F myProject
Folder PATH listing
Volume serial number is CC58-8E5C
C:\USERS\ADMINISTRATOR\MYPROJECT
   pom.xml

└───src
    ├───main
       └───java
           └───com
               └───test
                   └───project
                           App.java
    
    └───test
        └───java
            └───com
                └───test
                    └───project
                            AppTest.java

PS C:\Users\Administrator>

Как видите, пока не густо, но ведь надо хоть с чего-то начинать).

Теперь давайте скомпилируем наше "произведение искусства".

Перейдите к папке самого проекта, то есть там где находится pom.xml сгенерированный и запустите compile:

PS C:\Users\Administrator> cd myProject
PS C:\Users\Administrator\myProject> mvn compile
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building myProject 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plu
gin-2.6.pom
Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plug
in-2.6.pom (8 KB at 18.6 KB/sec)
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plu
gin-2.6.jar
Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-resources-plugin/2.6/maven-resources-plug
in-2.6.jar (29 KB at 184.8 KB/sec)
...
Downloaded: http://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-compiler-manager/1.9.1/plexus-compiler-manage
r-1.9.1.jar (5 KB at 23.2 KB/sec)
Downloaded: http://repo.maven.apache.org/maven2/org/codehaus/plexus/plexus-utils/3.0/plexus-utils-3.0.jar (221 KB at 679
.3 KB/sec)
[INFO] Compiling 1 source file to C:\Users\Administrator\myProject\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 13.259 s
[INFO] Finished at: 2014-07-20T14:04:54-04:00
[INFO] Final Memory: 12M/72M
[INFO] ------------------------------------------------------------------------

Как видите, опять пошли загрузки и в конце результат компиляции. Давайте опять посмотрим что у нас из этого вышло:

PS C:\Users\Administrator\myProject> tree /F
Folder PATH listing
Volume serial number is CC58-8E5C
C:.
   pom.xml

├───src
   ├───main
      └───java
          └───com
              └───test
                  └───project
                          App.java
   
   └───test
       └───java
           └───com
               └───test
                   └───project
                           AppTest.java

└───target
    └───classes
        └───com
            └───test
                └───project
                        App.class

Заметь-те что скомпилировался только класс App, AppTest - нет. Maven создан таким образом, что бы придерживаться идеологии, или даже стандарту TDD (Test Driven Development), таким образом прежде чем создать решение, нужно подготовить для него тест, и вот после этого появляется четкое выражение, то-есть оно как бы приобретает видимую структуру, как должно выглядеть само решение, или по крайне мере более четкое чем казалось изначально. Идем дальше и выполняем тест:

PS C:\Users\Administrator\myProject> mvn test
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building myProject 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-surefire-plugin/2.12.4/maven-surefire-pl
ugin-2.12.4.pom
Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-surefire-plugin/2.12.4/maven-surefire-plu
gin-2.12.4.pom (11 KB at 24.2 KB/sec)
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire/2.12.4/surefire-2.12.4.pom
Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire/2.12.4/surefire-2.12.4.pom (14 KB at
103.6 KB/sec)
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-surefire-plugin/2.12.4/maven-surefire-pl
ugin-2.12.4.jar
Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-surefire-plugin/2.12.4/maven-surefire-plu
gin-2.12.4.jar (30 KB at 128.2 KB/sec)
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ myProject ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\Users\Administrator\myProject\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ myProject ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ myProject ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\Users\Administrator\myProject\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:2.5.1:testCompile (default-testCompile) @ myProject ---
[INFO] Compiling 1 source file to C:\Users\Administrator\myProject\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ myProject ---
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-booter/2.12.4/surefire-booter-2.12.4
.pom
Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-booter/2.12.4/surefire-booter-2.12.4.
pom (3 KB at 24.1 KB/sec)
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-api/2.12.4/surefire-api-2.12.4.pom
Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-api/2.12.4/surefire-api-2.12.4.pom (3
 KB at 18.3 KB/sec)
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/surefire/maven-surefire-common/2.12.4/maven-surefire-c
ommon-2.12.4.pom
...
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-junit3/2.12.4/surefire-junit3-2.12.4
.jar
Downloaded: http://repo.maven.apache.org/maven2/org/apache/maven/surefire/surefire-junit3/2.12.4/surefire-junit3-2.12.4.
jar (26 KB at 167.6 KB/sec)

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.test.project.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.006 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.205 s
[INFO] Finished at: 2014-07-20T14:13:12-04:00
[INFO] Final Memory: 13M/72M
[INFO] ------------------------------------------------------------------------
PS C:\Users\Administrator\myProject>

Заметь-те, опять куча загрузок, компиляция тест класса и затем запуск с результатом. И вот что у нас вышло на сей раз:

PS C:\Users\Administrator\myProject> tree /F /A
Folder PATH listing
Volume serial number is CC58-8E5C
C:.
|   pom.xml
|
+---src
|   +---main
|   |   \---java
|   |       \---com
|   |           \---test
|   |               \---project
|   |                       App.java
|   |
|   \---test
|       \---java
|           \---com
|               \---test
|                   \---project
|                           AppTest.java
|
\---target
    +---classes
    |   \---com
    |       \---test
    |           \---project
    |                   App.class
    |
    +---surefire-reports
    |       com.test.project.AppTest.txt
    |       TEST-com.test.project.AppTest.xml
    |
    \---test-classes
        \---com
            \---test
                \---project
                        AppTest.class

PS C:\Users\Administrator\myProject>

 В принципе у нас готов шаблон по элементарному проекту.