 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.

=============

Preparing log4j releases.

=============


This is a detailed instruction to reproduce the log4j distribution
either to verify that the release is reproducable or to prepare
a hot-fix.

Install VMWare Player or Workstation appropriate for machine.

Download Ubuntu-6.06-1 desktop from http://www.vmware.com/vmtn/appliances/directory/ubuntu.html

Launch Ubuntu 6.06-1 in VMWare Player (user name and password are ubuntu)

Launch Synaptics Package Manager (System > Administration > Synaptic Package Manager), 
select all available repositories (Settings > Repositories), press Reload button 
to update list of available packages.  Select the following packages for installation: 
Subversion, mingw32, sun-java6-jdk, xemacs21.  Press Apply to install.  Exit Synaptics.

Download Maven-2.0.7 from http://maven.apache.org
Download JMX 1.2.1 Reference Implementation from 
   http://java.sun.com/products/JavaManagement/download.html
Download JMS 1.1 from http://java.sun.com/products/jms/docs.html
Unzip all in ~

Copy include/win32/jni_md.h from a Windows JDK to ~

From a command prompt:

$ export SVN_EDITOR=xemacs 
$ export JAVA_HOME=/usr/lib/jvm/java-6-sun
$ export PATH=$JAVA_HOME/bin:/home/ubuntu/maven-2.0.7/bin:$PATH
$ export JNI_WIN32_INCLUDE_DIR=/home/ubuntu
$ svn co https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15 log4j
$ mvn install:install-file -DgroupId=com.sun.jdmk -DartifactId=jmxtools \
          -Dversion=1.2.1 -Dpackaging=jar -Dfile=~/jmx-1_2_1-bin/lib/jmxtools.jar
$ mvn install:install-file -DgroupId=com.sun.jmx -DartifactId=jmxri \
          -Dversion=1.2.1 -Dpackaging=jar -Dfile=~/jmx-1_2_1-bin/lib/jmxri.jar
$ mvn install:install-file -DgroupId=javax.jms -DartifactId=jms \
          -Dversion=1.1 -Dpackaging=jar -Dfile=~/jms1.1/lib/jms.jar
$ cd log4j
$ mvn site assembly:assembly


If you intended to deploy jars to the repo or update the site,
you need to copy your private keys for people.apache.org 
over to ~/.ssh and update ~/maven-2.0.7/conf/settings.xml
to specify user name and key location.

    <server>
      <id>logging.repo</id>
      <username>USERNAME for people.apache.org</username>
      <privateKey>/home/ubuntu/.ssh/id_rsa</privateKey>
      <passphrase></passphrase>
    </server>

You should test your ssh connection to people.apache.org 
and localhost before attempting a deployment like:

$ ssh -l USERNAME people.apache.org
$ ssh localhost

release:perform has been running into http://jira.codehaus.org/browse/MRELEASE-273.
Release was attempted to be prepared with:

$ mvn release:perform -DconnectionUrl=scm:svn:https://svn.apache.org/repos/asf/logging/log4j/tags/v1_2_15_rc6

but it may have been necessary to specify a -Dgoals=".." to avoid the bug.  If so, 
any final build notes will be added to bug 40951.


