07 September 2015

Solaris VM Templates for WebLogic Server 12.1.3

A new set of VM Templates for Solaris have been made available on OTN. 
These templates  provide a quick and easy way to spin up pre-built WebLogic Server 12.1.3 instances using either Solaris Zones or Oracle VM Server for Sparc.

http://www.oracle.com/technetwork/server-storage/solaris11/downloads/solaris-vm-2621499.html


14 August 2015

WebLogic Server 12.1.3 Developer Zip - Update 3 Posted

An update has just been posted on OTN for the WebLogic Server 12.1.3 Developer Zip distribution.

WebLogic Server 12.1.3 Developer Zip Update 3 is built with the fixes from the WebLogic Server 12.1.3.0.4 Patch Set Update, providing developers with access to the latest set of fixes available in the corresponding production release.

See the download page for access to the update:

http://www.oracle.com/technetwork/middleware/weblogic/downloads/wls-for-dev-1703574.html

http://download.oracle.com/otn/nt/middleware/12c/wls/1213/wls1213_dev_update3.zip

The Update 3 README provides details of what has been included:

http://download.oracle.com/otn/nt/middleware/12c/wls/1213/README_WIN_UP3.txt


23 July 2015

NetBeans 8.1 Remote Debugging with WebLogic

Need to debug your application?  With NetBeans 8.1 (dev) and WebLogic it's very easy to do.

First start your WebLogic server in debug mode.  The startup scripts generated for a domain provide an option to start the server in debug mode. 

To run in debug mode, set the environment variable "debugFlag" to a value of "true" and  start the server.

$ export debugFlag="true"
$ ./startWebLogic.sh

 This launches the server with a command line such as that shown below, which sets the standard Java debug properties:
Starting WLS with line:
/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/bin/java -server -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8453,server=y,suspend=n -Djava.compiler=NONE  -Xmx512m -Dweblogic.Name=myserver -Djava.security.policy=/tmp/dev_update2/wls12130/wlserver/server/lib/weblogic.policy  -Xverify:none -Djava.endorsed.dirs=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/jre/lib/endorsed:/tmp/dev_update2/wls12130/wlserver/../oracle_common/modules/endorsed  -ea -da:com.bea... -da:javelin... -da:weblogic... -ea:com.bea.wli... -ea:com.bea.broker... -ea:com.bea.sbconsole... -Dwls.home=/tmp/dev_update2/wls12130/wlserver/server -Dweblogic.home=/tmp/dev_update2/wls12130/wlserver/server -Dweblogic.utils.cmm.lowertier.ServiceDisabled=true weblogic.Server
The console will display a message confirming the debug Java VM is using:
Listening for transport dt_socket at address: 8453

Now on the NetBeans side, create a new Server entry for your WebLogic instance using the new Remote Domain option:
 

Check the Server debug mode enabled option and specify the port (8453 by default):


Now specify the new server as the destination to use to run the application:

Now to debug your application, simply set a break point in your code and select the Debug option for the project:


 
This will build and deploy the application to the WebLogic remotely then open the Debugger in the IDE and connect it automatically to the WebLogic debug port. 

From here you can use all the standard debug facilities to step through your code, view stacks, instance data and so forth.

Debug away!




22 July 2015

NetBeans 8.1 Remote Deployment for WebLogic

Stoked that NetBeans 8.1 will have support for deployment to remote WebLogic Server instances.

http://wiki.netbeans.org/NewAndNoteworthyNB81#Remote_WebLogic



#lovethistool

09 April 2015

Deploying applications remotely with WebLogic REST Management Interface

WebLogic 12.1.3 provides a fully documented REST Management Interface that enables deployment and management operations to be performed using REST calls.

The table of contents from the documentation lists the set of operations available:
To use the REST Management Interface, it first must be enabled for a domain. This can be done from the WebLogic Console.

Domain > Configuration > General [Advanced] > Enable RESTful Management Services




To deploy an application to a remote server, the REST Management Interface provides the ability to upload an application archive and execute the deployment operation:
To perform this type of deployment operation a HTTP POST on the deployment URL is invoked specifying:
  1. The HTTP Header of multipart/form-data;
  2. The application archive is supplied as form field deployment;
  3. The deployment information specified using the form field model in which the application name, targets and other attributes are supplied;
Using curl this looks like the following:

$ curl \
  --user weblogic:welcome1 \
  -H X-Requested-By:TestForRest \
  -H Accept:application/json \
  -H Content-Type:multipart/form-data \
  -F "model={
    name: 'basicwebapp',
    targets: [ 'AdminServer' ]
  }" \
  -F "deployment=@/tmp/basicwebapp.war" \
  -X POST http://adc2101001.us.oracle.com:7001/management/wls/latest/deployments/application

When this REST call is made with curl, the application archive specified as @/tmp/basicwebapp.war is uploaded as a binary file using the form field deployment and the configuration information supplied in the model form parameter used to define and perform the deployment.

The response returned from the REST call contains a payload with the result of the operation that was performed.

{
    "messages": [{
        "message": "Deployed the application 'basicwebapp'.",
        "severity": "SUCCESS"
    }],
    "links": [{
        "rel": "job",
        "uri": "http://adc2101001:7001/management/wls/latest/jobs/deployment/id/3"
    }],
    "item": {
        "name": "ADTR-3",
        "id": "3",
        "type": "deployment",
        "status": "completed",
        "beginTime": 1428541581923,
        "endTime": 1428541584150,
        "targets": [{
            "name": "AdminServer",
            "type": "server",
            "errors": [],
            "status": "completed"
        }],
        "description": "[Deployer:149026]deploy application basicwebapp on AdminServer.",
        "operation": "deploy",
        "deploymentName": "basicwebapp"
    }
}

Further information about the deployment resource can be obtained using a further REST call, which provides links to operations that can be performed on the application, URLs to access the application, context-paths for registered servlets, runtime data and other useful information.

$ curl \
  --user weblogic:welcome1 \
  -H Accept:application/json \
  http://adc2101001:7001/management/wls/latest/deployments/application/id/basicwebapp

Which returns a response containing a payload with details of the deployment:

{
    "links": [
        {
            "rel": "parent",
            "uri": "http://adc2101001:7001/management/wls/latest/deployments/application"
        },
        {
            "rel": "action",
            "uri": "http://adc2101001:7001/management/wls/latest/deployments/application/id/basicwebapp/redeploy",
            "title": "redeploy"
        },
        {
            "rel": "action",
            "uri": "http://adc2101001:7001/management/wls/latest/deployments/application/id/basicwebapp/update",
            "title": "update"
        },
        {
            "rel": "action",
            "uri": "http://adc2101001:7001/management/wls/latest/deployments/application/id/basicwebapp/start",
            "title": "start"
        },
        {
            "rel": "action",
            "uri": "http://adc2101001:7001/management/wls/latest/deployments/application/id/basicwebapp/stop",
            "title": "stop"
        },
        {
            "rel": "bindables",
            "uri": "http://adc2101001:7001/management/wls/latest/deployments/application/id/basicwebapp/bindables"
        }
    ],
    "item": {
        "name": "basicwebapp",
        "state": "active",
        "type": "application",
        "displayName": "basicwebapp",
        "targets": ["AdminServer"],
        "planPath": "/scratch/sbutton/Oracle/Middleware/user_projects/domains/arq_domain/servers/AdminServer/upload/basicwebapp/plan/Plan.xml",
        "urls": ["http://adc2101001:7001/basicwebapp"],
        "openSessionsCurrentCount": 1,
        "sessionsOpenedTotalCount": 1,
        "servlets": [
            {
                "servletName": "JspServlet",
                "contextPath": "/basicwebapp",
                "aggregateMetrics": {
                    "executionTimeTotal": 0,
                    "invocationTotalCount": 0,
                    "reloadTotalCount": 0,
                    "executionTimeHigh": 0,
                    "executionTimeLow": 0
                },
                "servletMetrics": [{
                    "serverName": "AdminServer",
                    "executionTimeTotal": 0,
                    "invocationTotalCount": 0,
                    "reloadTotalCount": 0,
                    "executionTimeHigh": 0,
                    "executionTimeLow": 0
                }]
            },
            {
                "servletName": "Faces Servlet",
                "contextPath": "/basicwebapp",
                "aggregateMetrics": {
                    "executionTimeTotal": 22,
                    "invocationTotalCount": 1,
                    "reloadTotalCount": 1,
                    "executionTimeHigh": 22,
                    "executionTimeLow": 22
                },
                "servletMetrics": [{
                    "serverName": "AdminServer",
                    "executionTimeTotal": 22,
                    "invocationTotalCount": 1,
                    "reloadTotalCount": 1,
                    "executionTimeHigh": 22,
                    "executionTimeLow": 22
                }]
            },
            {
                "servletName": "FileServlet",
                "contextPath": "/basicwebapp",
                "aggregateMetrics": {
                    "executionTimeTotal": 0,
                    "invocationTotalCount": 0,
                    "reloadTotalCount": 0,
                    "executionTimeHigh": 0,
                    "executionTimeLow": 0
                },
                "servletMetrics": [{
                    "serverName": "AdminServer",
                    "executionTimeTotal": 0,
                    "invocationTotalCount": 0,
                    "reloadTotalCount": 0,
                    "executionTimeHigh": 0,
                    "executionTimeLow": 0
                }]
            }
        ],
        "ejbs": [],
        "deploymentPath": "servers/AdminServer/upload/basicwebapp/app/basicwebapp.war",
        "applicationType": "war",
        "health": {"state": "ok"}
    }
} 

The documentation provides extensive coverage of the many resources and entity types that can be reached via the REST Management Interface.

24 February 2015

Fronting Oracle Maven Repository with Sonatype Nexus

The Sonatype team have announced the release of Nexus 2.1.1 which is a minor update that now works with the Oracle Maven Repository.

I was going to write a bit up about it but Manfred Moser from Sonatype has already put together a blog and video on it:
With the new Nexus 2.11.2 release we are supporting the authentication mechanism used for the Oracle Maven repository in both Nexus OSS and Nexus Pro. This allows you to proxy the repository in Nexus and makes the components discoverable via browsing the index as well as searching for components.
You will only need to set this up once in Nexus and all your projects. Developers and CI servers get access to the components and the need for any manual work disappears.  On the Nexus side, the configuration changes can be done easily as part of your upgrade to the new release.

Check it out @ Using the Oracle Maven Repository with Nexus








10 February 2015

Fronting Oracle Maven Repository with Artifactory

The JFrog team announced this week the release of Artifactory 3.5.1, which is a minor update that now works with the Oracle Maven Repository.

http://www.jfrog.com/confluence/display/RTF/Artifactory+3.5.1

I spent a little while yesterday having a look at it, working through the configuration of a remote repository and testing it with a maven project to see how it worked.

Once I'd downloaded it and started it up -- much love for simple and obvious bin/*.sh scripts -- it was a very simple two step process:

1. Since we live behind a firewall first add a proxy configuration to point at our proxy server.



2. Add a new remote repository and pointed it at the Oracle Maven Repository, specifying its URL and using my OTN credentials as username and password.


The Artifactory 3.5.1 documentation stated that the Advanced Settings >  Lenient host authentication and Enable cookie management options must be checked when accessing the Oracle Maven Repository.


The Test button is handy to verify the server settings have been entered correctly.

3. Use the Home tab > Client Settings > Maven Settings link to generate and save a settings.xml file that uses the artifactory server.



With the repository running, configured and the settings.xml saved, its then possible to try it out with an existing maven project such as https://github.com/buttso/weblogic-with-arquillian.

I also nuked my local repository to force/verify that the dependencies were fetched through the specified Artifactory server.

$ rm -fr ~/.m2/repository/com/oracle
$ mvn -s artifactory-settings.xml test

Viewing the output of the mvn process and the running Artifactory server you can see that maven is downloading dependencies from http://localhost:8081/artifactory and correspondingly Artifactory is downloading the requested artifact from https://maven.oracle.com.


Once the maven process has completed and all the requested artifacts downloaded, Artifactory will have cached them locally for future use.
 
Using the Search functionality of the Artifactory Web UI you can search for weblogic artifacts.


Using the Repository Browser functionality of the Artifactory Web UI you can view and navigate around the contents of the remote Oracle Maven Repository.

Nice JFrog > Artifactory team - thanks for the quick support of our repository.

One further thing I'd look at doing is enabling the Configure Passwords Encryption option in the Security settings to encrypt your OTN password, so that it's not stored in cleartext in the etc/artifactory.config.latest.xml file.



09 February 2015

Oracle Maven Repository - Viewing Contents in Eclipse

With the Oracle Maven Repository now accessible one way to have explore its contents is to use the Maven Repositories viewer feature available in most development tools. I've seen the repository contents displayed easily in NetBeans so I decided to take a look at what it looks like in Eclipse as well.

I had to make a few minor setting changes to get it to work so decided to document them here.  If you've gotten it to work with less setting changes, let me know!

As initial setup, I configured my local maven environment to support access to the Oracle Maven Repository.  This is documented here https://maven.oracle.com/doc.html.  I also installed maven-3.2.5 that includes the updated Wagon module that supports authentication.

Next I downloaded and used the new network installer that the Oracle Eclipse team has published on OTN to install the latest version of Oracle Enterprise Pack for Eclipse.



This network installer lets developers select the version of Eclipse to install and the set of Oracle extensions --  Weblogic, GlassFish and other stuff -- to add in to it.

 Once Eclipse is installed, you can add the Maven Repository viewer by selecting   Window > Show View > Other > Maven Repositories from the Eclipse toolbar.



I also added a Console > Maven viewer to see what was happening under the covers and arranged them so they were visible at the same time:


With the Maven views ready to go, expand the Global Repositories node. This will show Maven Central (any other repositories you may have configured) and the Oracle Maven Repository if you have configured it correctly in the settings.xml file.

The initial state of the Oracle Maven Repository doesn't show any contents indicating that its index hasn't been downloaded to display.

Right mouse clicking on it and selecting the Rebuild Index option causes an error to be shown in the console output indicating that the index could not be accessed.


To get it to work, I made the following changes to my environment.  

Configure Eclipse to Use Maven 3.2.5

Using the Eclipse > Preferences > Maven > Installation dialog, configure Eclipse to use Maven 3.2.5.  This is preferred version of Maven to use to access the Oracle Maven Repository since it automatically includes the necessary version of the Wagon HTTP module that supports the required authentication configuration and request flow.


Configure Proxy Settings in Maven Settings File

** If you don't need a proxy to access the Internet then step won't be needed **
 
If you sit behind a firewall and need to use a proxy server to access public repositories then you need to configure a proxy setting inside the maven settings file.

Interestingly for command line maven use and NetBeans a single proxy configuration in settings.xml was enough to allow the Oracle Maven Repository to be successfully accesses and its index and artifacts used.

However with Eclipse, this setting alone didn't allow the Oracle Maven Repository to be accessed.  Looking at the repository URL for the Oracle Maven Repository you can see ity's HTTPS based -- https://maven.oracle.com and it appears for Eclipse that a specific HTTPS based proxy setting is required for Eclipse to access HTTPS based repositories.


Rebuild Index Success

With the settings in place, the Rebuild Index operation succeeds and the contents of the Oracle Maven Repository are displayed in the repository viewer.



04 February 2015

Bare-Bones Example of Using WebLogic and Arquillian

The Arquillian project is proving to be very popular for testing code and applications.  It's particularly useful for Java EE projects since it allows for in-container testing to be performed, enabling unit tests to use dependency injection and all the common services  provided by the Java EE platform.

Arquillian uses the concept of container adapters to allow it to execute test code with a  specific test environment.  For the Java EE area,  most of the Java EE implementations have an adapter than can be used to perform the deployment of the archive under test and to execute and report on the results of the unit tests.
A handy way to see all the WebLogic Server related content on the Arquillian blog is this URL: http://arquillian.org/blog/tags/wls/
For WebLogic Server the current set of adapters are listed here: http://arquillian.org/blog/2015/01/09/arquillian-container-wls-1-0-0-Alpha3/

There are multiple adapters available for use.  Some of them are historical and some are for use with older versions of WebLogic Server (10.3).
We are actively working with the Arquillian team on finalizing the name, version and status of a WebLogic Server adapter.
The preferred adapter set from the WebLogic Server perspective are these:


These adapters utilize the WebLogic Server JMX API to perform their tasks and are the adapters used internally by the development teams when working with Arquillian.  They have been tested to work with WebLogic Server [12.1.1, 12.1.2, 12.1.3].  We also have been using them internally with the 12.2.1 version under development to run the CDI TCK and other tests.

To demonstrate WebLogic Server working with Arquillian a bare-bones example is available on GitHub here: https://github.com/buttso/weblogic-with-arquillian

This example has the most basic configuration you can use to employ Arquillian with a Maven project to deploy and execute tests using WebLogic Server 12.1.3.
 
The README.md file in the project contains more details and a longer description.  In summary though:

1. The first step is to add the Arquillian related dependencies in the Maven pom.xml:

2. The next step is to create an arquillian.xml file that the container adapter uses to connect to the remote server that is being used as the server to run the tests:

3. The last step is to create a unit test which is run with Arquillian.  The unit test is responsible for implementing the @Deployment method which constructs an archive to deploy that contains the code to be tested.  The unit test then provides @Test methods in which the deployment is tested to verify its behaviour:


Executing the unit tests, with the associated archive creation and deployment to the server is performed using the maven test goal:


The tests can be executed directly from IDEs such as NetBeans and Eclipse using the Run Test features:

Executing Tests using NetBeans

03 February 2015

Social Coding Resolves JAX-RS and CDI Producer Problem

The inimitable Bruno Borges picked up tweet earlier today commenting on a problem using @Produces with non-CDI libraries with WebLogic Server 12.1.3.

The tweeter put his example up on a github repository to share - quite a nice example of using JAX-RS, CDI integration and of using Arquillian to verify it works correctly.  Ticked a couple of boxes for what I've been looking at lately

Forking his project to have a look at it locally:

https://github.com/buttso/weblogic-producers

Turns out that the issue was quite a simple and common one - a missing reference to the jax-rs:2.0 shared-library that is needed to use JAX-RS 2.0 on WebLogic Server 12.1.3.   Needs a weblogic.xml to reference that library.

I made the changes in a local branch and tested it again:

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] producers .......................................... SUCCESS [  0.002 s]
[INFO] bean ............................................... SUCCESS [  0.686 s]
[INFO] web ................................................ SUCCESS [  7.795 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------


With the tests now passing, pushed the branch to my fork and sent Kuba a pull request to have a look at the changes I made:

https://github.com/buttso/weblogic-producers/tree/steve_work

I now just hope it works in his environment too :-)

The GitHub model is pretty magical really.