Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package apache-commons-logging for
openSUSE:Factory checked in at 2026-06-25 10:49:48
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/apache-commons-logging (Old)
and /work/SRC/openSUSE:Factory/.apache-commons-logging.new.2088 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "apache-commons-logging"
Thu Jun 25 10:49:48 2026 rev:31 rq:1361308 version:1.4.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/apache-commons-logging/apache-commons-logging.changes
2026-05-21 18:24:38.067896260 +0200
+++
/work/SRC/openSUSE:Factory/.apache-commons-logging.new.2088/apache-commons-logging.changes
2026-06-25 10:50:45.243972561 +0200
@@ -1,0 +2,14 @@
+Sun Jun 21 15:44:39 UTC 2026 - Fridrich Strba <[email protected]>
+
+- Upgrade to 1.4.0
+ * Fixed Bugs
+ + Use the new Apache oak leaf logo
+ + Fix broken URLs in website links
+ + Add support for Jakarta servlets, see org.apache.commons
+ .logging.jakarta.ServletContextCleaner #419
+ * Changes
+ + Bump org.apache.commons:commons-parent from 97 to 102
+ + Bump log4j2.version from 2.25.3 to 2.26.0
+ + Bump org.slf4j:slf4j-api from 2.0.17 to 2.0.18
+
+-------------------------------------------------------------------
Old:
----
build.properties
build.xml
commons-logging-1.3.6-src.tar.gz
New:
----
apache-commons-logging-build.xml
commons-logging-1.4.0-src.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ apache-commons-logging.spec ++++++
--- /var/tmp/diff_new_pack.vziZvk/_old 2026-06-25 10:50:46.720023695 +0200
+++ /var/tmp/diff_new_pack.vziZvk/_new 2026-06-25 10:50:46.724023833 +0200
@@ -20,16 +20,19 @@
%define base_name logging
%define short_name commons-%{base_name}
Name: apache-%{short_name}
-Version: 1.3.6
+Version: 1.4.0
Release: 0
Summary: Apache Commons Logging
License: Apache-2.0
URL: https://commons.apache.org/%{base_name}
Source0:
https://archive.apache.org/dist/commons/%{base_name}/source/%{short_name}-%{version}-src.tar.gz
-Source1: build.xml
-Source2: build.properties
+Source1: %{name}-build.xml
BuildRequires: ant
+BuildRequires: avalon-framework-api
+BuildRequires: avalon-logkit
+BuildRequires: fdupes
BuildRequires: glassfish-servlet-api
+BuildRequires: jakarta-servlet
BuildRequires: java-devel >= 1.8
BuildRequires: javapackages-local >= 6
BuildRequires: reload4j
@@ -51,36 +54,43 @@
the two, and to allow a developer to not tie himself to a particular
logging implementation.
+%package javadoc
+Summary: Javadoc for %{name}
+Group: Documentation/HTML
+
+%description javadoc
+Javadoc for %{name}.
+
%prep
%setup -q -n %{short_name}-%{version}-src
cp %{SOURCE1} build.xml
-cp %{SOURCE2} build.properties
+%pom_remove_dep :log4j-api
+rm src/main/java/org/apache/commons/logging/impl/Log4jApiLogFactory.java
+%pom_remove_dep :slf4j-api
+rm src/main/java/org/apache/commons/logging/impl/Slf4jLogFactory.java
-rm \
- src/main/java/org/apache/commons/logging/impl/Log4jApiLogFactory.java \
- src/main/java/org/apache/commons/logging/impl/Slf4jLogFactory.java
+%pom_change_dep org.apache.logging.log4j:log4j-1.2-api
ch.qos.reload4j:reload4j:1.2.25
+%pom_change_dep :avalon-framework ::avalon-framework-api:4.3
sed -i 's/\r//' RELEASE-NOTES.txt LICENSE.txt
%build
-export MAVEN_REPO_LOCAL=$(pwd)/.m2/repository
-mkdir -p $MAVEN_REPO_LOCAL
-
-export CLASSPATH=$(build-classpath \
- plexus/ \
- ):target/classes:target/test-classes
-ant \
- -Dmaven.mode.offline=true -lib %{_javadir} \
- -Dlog4j12.jar=$(find-jar reload4j/reload4j) -Dservletapi.jar=$(find-jar
glassfish-servlet-api) \
- dist
+mkdir -p lib
+build-jar-repository -s lib \
+ avalon-framework-api \
+ avalon-logkit \
+ glassfish-servlet-api \
+ jakarta-servlet/jakarta.servlet-api \
+ reload4j/reload4j
+ant jar javadoc
%install
# jars
-install -d -m 755 %{buildroot}%{_javadir}
-install -p -m 644 target/%{short_name}-%{version}.jar
%{buildroot}%{_javadir}/%{name}.jar
-install -p -m 644 target/%{short_name}-api-%{version}.jar
%{buildroot}%{_javadir}/%{name}-api.jar
-install -p -m 644 target/%{short_name}-adapters-%{version}.jar
%{buildroot}%{_javadir}/%{name}-adapters.jar
+install -dm 0755 %{buildroot}%{_javadir}
+install -pm 0644 target/%{short_name}-%{version}.jar
%{buildroot}%{_javadir}/%{name}.jar
+install -pm 0644 target/%{short_name}-%{version}-api.jar
%{buildroot}%{_javadir}/%{name}-api.jar
+install -pm 0644 target/%{short_name}-%{version}-adapters.jar
%{buildroot}%{_javadir}/%{name}-adapters.jar
pushd %{buildroot}%{_javadir}
for jar in %{name}*; do
@@ -89,14 +99,22 @@
popd
# pom
-install -d -m 755 %{buildroot}%{_mavenpomdir}
+install -dm 0755 %{buildroot}%{_mavenpomdir}
%{mvn_install_pom} pom.xml %{buildroot}/%{_mavenpomdir}/%{short_name}.pom
%add_maven_depmap %{short_name}.pom %{short_name}.jar -a
"org.apache.commons:%{short_name}","apache:%{short_name}"
%add_maven_depmap %{short_name}:%{short_name}::api:%{version}
%{short_name}-api.jar -a
"%{short_name}:%{short_name}-api","org.apache.commons:%{short_name}-api","apache:%{short_name}-api"
%add_maven_depmap %{short_name}:%{short_name}::adapters:%{version}
%{short_name}-adapters.jar -a
"%{short_name}:%{short_name}-adapters","org.apache.commons:%{short_name}-adapters","apache:%{short_name}-adapters"
+# javadoc
+install -dm 755 %{buildroot}%{_javadocdir}/%{name}
+cp -pr target/site/apidocs/* %{buildroot}%{_javadocdir}/%{name}/
+%fdupes -s %{buildroot}%{_javadocdir}/%{name}/
+
%files -f .mfiles
%{_javadir}/%{name}*.jar
%license LICENSE.txt
%doc PROPOSAL.html RELEASE-NOTES.txt NOTICE.txt
+%files javadoc
+%{_javadocdir}/%{name}
+
++++++ _scmsync.obsinfo ++++++
--- /var/tmp/diff_new_pack.vziZvk/_old 2026-06-25 10:50:46.824027298 +0200
+++ /var/tmp/diff_new_pack.vziZvk/_new 2026-06-25 10:50:46.836027713 +0200
@@ -1,6 +1,6 @@
-mtime: 1779181146
-commit: 1c099473ab03fc2dad685962e61b15fa116bd333b6ef7e08e010261f3348b1b1
+mtime: 1782205141
+commit: f948427148d255c91d9023d67d0b3102faf1d5c755bb62a5b184df7a59e21f2a
url: https://src.opensuse.org/java-packages/apache-commons-logging
-revision: 1c099473ab03fc2dad685962e61b15fa116bd333b6ef7e08e010261f3348b1b1
+revision: f948427148d255c91d9023d67d0b3102faf1d5c755bb62a5b184df7a59e21f2a
projectscmsync: https://src.opensuse.org/java-packages/_ObsPrj
++++++ apache-commons-logging-build.xml ++++++
<?xml version="1.0" encoding="UTF-8"?>
<project name="commons-logging" default="package" basedir=".">
<!-- ======================================================================
-->
<!-- Build environment properties
-->
<!-- ======================================================================
-->
<property file="build.properties" />
<property name="project.groupId" value="commons-logging" />
<property name="project.artifactId" value="commons-logging" />
<property name="spec.version" value="1.4" />
<property name="project.version" value="${spec.version}.0" />
<property name="compiler.release" value="8" />
<property name="compiler.source" value="1.${compiler.release}" />
<property name="compiler.target" value="${compiler.source}" />
<property name="build.finalName"
value="${project.artifactId}-${project.version}" />
<property name="build.dir" value="target"/>
<property name="build.outputDir" value="${build.dir}/classes"/>
<property name="build.srcDir" value="src/main/java"/>
<property name="build.resourceDir" value="."/>
<property name="reporting.outputDirectory" value="${build.dir}/site"/>
<!-- ======================================================================
-->
<!-- Defining classpaths
-->
<!-- ======================================================================
-->
<path id="build.classpath">
<fileset dir="lib">
<include name="**/*.jar">
</include>
</fileset>
</path>
<!-- ======================================================================
-->
<!-- Cleaning up target
-->
<!-- ======================================================================
-->
<target name="clean" description="Clean the output directory">
<delete dir="${build.dir}"/>
</target>
<!-- ======================================================================
-->
<!-- Compilation target
-->
<!-- ======================================================================
-->
<target name="compile" description="Compile the code">
<mkdir dir="${build.outputDir}"/>
<javac destdir="${build.outputDir}"
encoding="UTF-8"
nowarn="false"
debug="true"
optimize="false"
deprecation="true"
release="${compiler.release}"
target="${compiler.target}"
verbose="false"
fork="false"
source="${compiler.source}">
<src>
<pathelement location="${build.srcDir}"/>
</src>
<classpath refid="build.classpath"/>
</javac>
<mkdir dir="${build.outputDir}/META-INF"/>
<copy todir="${build.outputDir}/META-INF">
<fileset dir="${build.resourceDir}">
<include name="NOTICE.txt"/>
<include name="LICENSE.txt"/>
<include name="NOTICE"/>
<include name="LICENSE"/>
</fileset>
</copy>
</target>
<!-- ======================================================================
-->
<!-- Javadoc target
-->
<!-- ======================================================================
-->
<target name="javadoc" description="Generates the Javadoc of the application">
<javadoc sourcepath="${build.srcDir}"
packagenames="*"
destdir="${reporting.outputDirectory}/apidocs"
access="protected"
verbose="false"
encoding="UTF-8"
version="true"
use="true"
author="true"
splitindex="false"
nodeprecated="false"
nodeprecatedlist="false"
notree="false"
noindex="false"
nohelp="false"
nonavbar="false"
serialwarn="false"
docencoding="UTF-8"
source="${compiler.source}"
linksource="true"
breakiterator="false">
<classpath refid="build.classpath"/>
</javadoc>
</target>
<!-- ======================================================================
-->
<!-- Package target
-->
<!-- ======================================================================
-->
<macrodef name="build-jar">
<attribute name="suffix" default=""/>
<element name="includes" optional="true"/>
<element name="excludes" optional="true"/>
<sequential>
<jar jarfile="${build.dir}/${build.finalName}@{suffix}.jar"
compress="true"
index="false"
basedir="${build.outputDir}"
excludes="**/package.html">
<includes/>
<excludes/>
<manifest>
<attribute name="Automatic-Module-Name"
value="org.apache.commons.logging"/>
<attribute name="Bundle-Description" value="Apache Commons Logging is
a thin adapter allowing configurable bridging to other, well-known logging
systems."/>
<attribute name="Bundle-DocURL"
value="https://commons.apache.org/proper/commons-logging/"/>
<attribute name="Bundle-License"
value="https://www.apache.org/licenses/LICENSE-2.0.txt"/>
<attribute name="Bundle-ManifestVersion" value="2"/>
<attribute name="Bundle-Name" value="Apache Commons Logging"/>
<attribute name="Bundle-SymbolicName"
value="org.apache.commons.${project.artifactId}"/>
<attribute name="Bundle-Vendor" value="The Apache Software
Foundation"/>
<attribute name="Bundle-Version" value="${project.version}"/>
<attribute name="Export-Package"
value="org.apache.commons.logging.impl;version="${project.version}";uses:="javax.servlet,org.apache.avalon.framework.logger,org.apache.commons.logging,org.apache.log,org.apache.log4j",org.apache.commons.logging.jakarta;version="${project.version}";uses:="jakarta.servlet",org.apache.commons.logging;version="${project.version}""/>
<attribute name="Implementation-Title" value="Apache Commons
Logging"/>
<attribute name="Implementation-Vendor" value="The Apache Software
Foundation"/>
<attribute name="Implementation-Version" value="${project.version}"/>
<attribute name="Import-Package"
value="jakarta.servlet;version="[4.0.2,7.0.0)";resolution:=optional,javax.servlet;version="[2.1.0,5.0.0)";resolution:=optional,org.apache.avalon.framework.logger;version="[4.1.3,4.1.5]";resolution:=optional,org.apache.log4j;version="[1.2.15,2.0.0)";resolution:=optional,org.apache.log;version="[1.0.1,1.0.1]";resolution:=optional,org.apache.logging.log4j.spi;version="[2.0,4.0)";resolution:=optional,org.apache.logging.log4j.util;version="[2.0,4.0)";resolution:=optional,org.apache.logging.log4j;version="[2.0,4.0)";resolution:=optional,org.slf4j.spi;version="[1.7,3)";resolution:=optional,org.slf4j;version="[1.7,3)";resolution:=optional"/>
<attribute name="Include-Resource"
value="META-INF/LICENSE.txt=LICENSE.txt,META-INF/NOTICE.txt=NOTICE.txt"/>
<attribute name="Require-Capability"
value="osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))",osgi.extender;filter:="(&(osgi.extender=osgi.serviceloader.processor)(version>=1.0.0)(!(version>=2.0.0)))";resolution:=optional,osgi.serviceloader;filter:="(osgi.serviceloader=org.apache.commons.logging.LogFactory)";osgi.serviceloader="org.apache.commons.logging.LogFactory";resolution:=optional;cardinality:=multiple"/>
<attribute name="Specification-Title" value="Apache Commons Logging"/>
<attribute name="Specification-Vendor" value="The Apache Software
Foundation"/>
<attribute name="Specification-Version" value="${spec.version}"/>
</manifest>
</jar>
</sequential>
</macrodef>
<target name="package" depends="compile" description="Package the
application">
<build-jar suffix=""/>
<build-jar suffix="-api">
<includes>
<include name="org/apache/commons/logging/*.class"/>
<include name="org/apache/commons/logging/impl/LogFactoryImpl*.class"/>
<include name="org/apache/commons/logging/impl/WeakHashtable*.class"/>
<include name="org/apache/commons/logging/impl/SimpleLog*.class"/>
<include name="org/apache/commons/logging/impl/NoOpLog*.class"/>
<include name="org/apache/commons/logging/impl/Jdk14Logger.class"/>
<include name="META-INF/LICENSE.txt"/>
<include name="META-INF/NOTICE.txt"/>
</includes>
</build-jar>
<build-jar suffix="-adapters">
<includes>
<include name="org/apache/commons/logging/impl/**/*.class"/>
<include name="META-INF/LICENSE.txt"/>
<include name="META-INF/NOTICE.txt"/>
</includes>
<excludes>
<exclude name="org/apache/commons/logging/impl/WeakHashtable*.class"/>
<exclude name="org/apache/commons/logging/impl/LogFactoryImpl*.class"/>
</excludes>
</build-jar>
</target>
<!-- ======================================================================
-->
<!-- A dummy target for the package named after the type it creates
-->
<!-- ======================================================================
-->
<target name="jar" depends="package" description="Builds the jar for the
application"/>
</project>
++++++ build.specials.obscpio ++++++
++++++ build.specials.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore 1970-01-01 01:00:00.000000000 +0100
+++ new/.gitignore 2026-06-23 10:59:01.000000000 +0200
@@ -0,0 +1 @@
+.osc
++++++ commons-logging-1.3.6-src.tar.gz -> commons-logging-1.4.0-src.tar.gz
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/commons-logging-1.3.6-src/RELEASE-NOTES.txt
new/commons-logging-1.4.0-src/RELEASE-NOTES.txt
--- old/commons-logging-1.3.6-src/RELEASE-NOTES.txt 2026-03-05
00:05:20.000000000 +0100
+++ new/commons-logging-1.4.0-src/RELEASE-NOTES.txt 2026-06-11
22:45:24.000000000 +0200
@@ -1,3 +1,42 @@
+Apache Commons Logging 1.4.0 Release Notes
+------------------------------------------
+
+The Apache Commons Logging team is pleased to announce the release of Apache
Commons Logging 1.4.0.
+
+Apache Commons Logging is a thin adapter allowing configurable bridging to
other,
+well-known logging systems.
+
+This is a feature and maintenance release. Java 8 or later is required.
+
+Changes in this version
+-----------------------
+
+
+Fixed Bugs
+----------
+
+* Use the new Apache oak leaf logo. Thanks to Gary Gregory.
+* Fix broken URLs in website links. Thanks to Stanimir
Stamenkov, Gary Gregory.
+* Add support for Jakarta servlets, see
org.apache.commons.logging.jakarta.ServletContextCleaner #419. Thanks to Kiril
Keranov, Gary Gregory.
+
+Changes
+-------
+
+* Bump org.apache.commons:commons-parent from 97 to 102. Thanks
to Gary Gregory.
+* Bump log4j2.version from 2.25.3 to 2.26.0. Thanks to Gary
Gregory, Dependabot.
+* Bump org.slf4j:slf4j-api from 2.0.17 to 2.0.18. Thanks to Gary
Gregory, Dependabot.
+
+
+Historical list of changes:
https://commons.apache.org/proper/commons-logging/changes.html
+
+Download it from
https://commons.apache.org/proper/commons-logging/download_logging.cgi
+
+For complete information on Apache Commons Logging, including instructions on
how to submit bug reports,
+patches, or suggestions for improvement, see the Apache Commons Logging
website:
+
+https://commons.apache.org/proper/commons-logging/
+
+-----------------------------------------------------------------------------
Apache Commons Logging 1.3.6 Release Notes
------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/commons-logging-1.3.6-src/pom.xml
new/commons-logging-1.4.0-src/pom.xml
--- old/commons-logging-1.3.6-src/pom.xml 2026-03-05 00:05:20.000000000
+0100
+++ new/commons-logging-1.4.0-src/pom.xml 2026-06-11 22:45:24.000000000
+0200
@@ -26,13 +26,13 @@
<parent>
<groupId>org.apache.commons</groupId>
<artifactId>commons-parent</artifactId>
- <version>97</version>
+ <version>102</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<name>Apache Commons Logging</name>
- <version>1.3.6</version>
+ <version>1.4.0</version>
<description>Apache Commons Logging is a thin adapter allowing configurable
bridging to other,
well-known logging systems.</description>
<url>https://commons.apache.org/proper/commons-logging/</url>
@@ -43,9 +43,9 @@
<maven.compiler.target>${commons.logging.javaversion}</maven.compiler.target>
<commons.componentid>logging</commons.componentid>
<commons.module.name>org.apache.commons.logging</commons.module.name>
- <commons.release.version>1.3.6</commons.release.version>
- <commons.release.next>1.3.7</commons.release.next>
- <commons.bc.version>1.3.5</commons.bc.version>
+ <commons.release.version>1.4.0</commons.release.version>
+ <commons.release.next>1.4.1</commons.release.next>
+ <commons.bc.version>1.3.6</commons.bc.version>
<commons.release.isDistModule>true</commons.release.isDistModule>
<commons.jira.id>LOGGING</commons.jira.id>
<commons.jira.pid>12310484</commons.jira.pid>
@@ -56,12 +56,14 @@
<commons.failsafe.version>3.2.1</commons.failsafe.version>
<!-- Allow default test run order to be changed -->
<failsafe.runorder>filesystem</failsafe.runorder>
- <log4j2.version>2.25.3</log4j2.version>
+ <log4j2.version>2.26.0</log4j2.version>
<logback.version>1.3.16</logback.version>
- <slf4j.version>2.0.17</slf4j.version>
+ <slf4j.version>2.0.18</slf4j.version>
<findsecbugs.version>1.14.0</findsecbugs.version>
+ <jakarta.servlet-api.version>5.0.0</jakarta.servlet-api.version>
<commons.osgi.import>
javax.servlet;version="[2.1.0, 5.0.0)";resolution:=optional,
+ jakarta.servlet;version="[4.0.2, 7.0.0)";resolution:=optional,
org.apache.avalon.framework.logger;version="[4.1.3,
4.1.5]";resolution:=optional,
org.apache.log;version="[1.0.1, 1.0.1]";resolution:=optional,
org.apache.log4j;version="[1.2.15, 2.0.0)";resolution:=optional,
@@ -72,7 +74,7 @@
org.slf4j.spi;version="[1.7, 3)";resolution:=optional
</commons.osgi.import>
<!-- project.build.outputTimestamp is managed by Maven plugins, see
https://maven.apache.org/guides/mini/guide-reproducible-builds.html -->
-
<project.build.outputTimestamp>2026-03-04T23:05:20Z</project.build.outputTimestamp>
+
<project.build.outputTimestamp>2026-06-11T20:45:24Z</project.build.outputTimestamp>
<!-- JaCoCo: Don't make code coverage worse than: -->
<commons.jacoco.haltOnFailure>true</commons.jacoco.haltOnFailure>
<commons.jacoco.classRatio>0.42</commons.jacoco.classRatio>
@@ -275,6 +277,7 @@
<log4j-api>${org.apache.logging.log4j:log4j-api:jar}</log4j-api>
<logkit>${logkit:logkit:jar}</logkit>
<servlet-api>${javax.servlet:javax.servlet-api:jar}</servlet-api>
+
<jakarta-servlet-api>${jakarta.servlet:jakarta.servlet-api:jar}</jakarta-servlet-api>
<commons-logging>target/${project.build.finalName}.jar</commons-logging>
<commons-logging-api>target/${project.build.finalName}-api.jar</commons-logging-api>
<commons-logging-adapters>target/${project.build.finalName}-adapters.jar</commons-logging-adapters>
@@ -578,6 +581,13 @@
<scope>provided</scope>
<optional>true</optional>
</dependency>
+ <dependency>
+ <groupId>jakarta.servlet</groupId>
+ <artifactId>jakarta.servlet-api</artifactId>
+ <version>${jakarta.servlet-api.version}</version>
+ <scope>provided</scope>
+ <optional>true</optional>
+ </dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/commons-logging-1.3.6-src/src/changes/changes.xml
new/commons-logging-1.4.0-src/src/changes/changes.xml
--- old/commons-logging-1.3.6-src/src/changes/changes.xml 2026-03-05
00:05:20.000000000 +0100
+++ new/commons-logging-1.4.0-src/src/changes/changes.xml 2026-06-11
22:45:24.000000000 +0200
@@ -45,6 +45,17 @@
<title>Release Notes</title>
</properties>
<body>
+ <release version="1.4.0" date="2026-06-11" description="This is a feature
and maintenance release. Java 8 or later is required.">
+ <!-- FIX -->
+ <action dev="ggregory" type="fix" due-to="Gary Gregory">Use the new
Apache oak leaf logo.</action>
+ <action dev="ggregory" type="fix" due-to="Stanimir Stamenkov, Gary
Gregory">Fix broken URLs in website links.</action>
+ <!-- ADD -->
+ <action dev="ggregory" type="fix" due-to="Kiril Keranov, Gary
Gregory">Add support for Jakarta servlets, see
org.apache.commons.logging.jakarta.ServletContextCleaner #419.</action>
+ <!-- UPDATE -->
+ <action dev="ggregory" type="update" due-to="Gary Gregory">Bump
org.apache.commons:commons-parent from 97 to 102.</action>
+ <action dev="ggregory" type="update" due-to="Gary Gregory,
Dependabot">Bump log4j2.version from 2.25.3 to 2.26.0.</action>
+ <action dev="ggregory" type="update" due-to="Gary Gregory,
Dependabot">Bump org.slf4j:slf4j-api from 2.0.17 to 2.0.18.</action>
+ </release>
<release version="1.3.6" date="2026-03-04" description="This is a feature
and maintenance release. Java 8 or later is required.">
<!-- FIX -->
<action dev="ggregory" type="fix" due-to="Gary Gregory">Fix running
spotbugs:check: Unable to parse configuration of mojo.</action>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/commons-logging-1.3.6-src/src/changes/release-notes.vm
new/commons-logging-1.4.0-src/src/changes/release-notes.vm
--- old/commons-logging-1.3.6-src/src/changes/release-notes.vm 2026-03-05
00:05:20.000000000 +0100
+++ new/commons-logging-1.4.0-src/src/changes/release-notes.vm 2026-06-11
22:45:24.000000000 +0200
@@ -15,7 +15,7 @@
## specific language governing permissions and limitations
## under the License.
${project.name} ${version} Release Notes
-------------------------------------------------
+------------------------------------------
The ${developmentTeam} is pleased to announce the release of ${project.name}
${version}.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/commons-logging-1.3.6-src/src/main/java/org/apache/commons/logging/Log.java
new/commons-logging-1.4.0-src/src/main/java/org/apache/commons/logging/Log.java
---
old/commons-logging-1.3.6-src/src/main/java/org/apache/commons/logging/Log.java
2026-03-05 00:05:20.000000000 +0100
+++
new/commons-logging-1.4.0-src/src/main/java/org/apache/commons/logging/Log.java
2026-06-11 22:45:24.000000000 +0200
@@ -24,6 +24,7 @@
* parameter representing the "name" of this Log.
* <p>
* The six logging levels used by {@code Log} are (in order):
+ * </p>
* <ol>
* <li>trace (the least serious)</li>
* <li>debug</li>
@@ -32,17 +33,21 @@
* <li>error</li>
* <li>fatal (the most serious)</li>
* </ol>
+ * <p>
* The mapping of these log levels to the concepts used by the underlying
* logging system is implementation dependent.
* The implementation should ensure, though, that this ordering behaves
* as expected.
+ * </p>
* <p>
* Performance is often a logging concern.
* By examining the appropriate property,
* a component can avoid expensive operations (producing information
* to be logged).
+ * </p>
* <p>
- * For example,
+ * For example:
+ * </p>
* <pre>
* if (log.isDebugEnabled()) {
* ... do something expensive ...
@@ -53,6 +58,7 @@
* Configuration of the underlying logging system will generally be done
* external to the Logging APIs, through whatever mechanism is supported by
* that system.
+ * </p>
*/
public interface Log {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/commons-logging-1.3.6-src/src/main/java/org/apache/commons/logging/LogSource.java
new/commons-logging-1.4.0-src/src/main/java/org/apache/commons/logging/LogSource.java
---
old/commons-logging-1.3.6-src/src/main/java/org/apache/commons/logging/LogSource.java
2026-03-05 00:05:20.000000000 +0100
+++
new/commons-logging-1.4.0-src/src/main/java/org/apache/commons/logging/LogSource.java
2026-06-11 22:45:24.000000000 +0200
@@ -29,6 +29,7 @@
* <p>
* By default, calling {@code getInstance()} will use the following
* algorithm:
+ * </p>
* <ul>
* <li>If Log4J is available, return an instance of
* {@code org.apache.commons.logging.impl.Log4JLogger}.</li>
@@ -39,6 +40,7 @@
* </ul>
* <p>
* You can change the default behavior in one of two ways:
+ * </p>
* <ul>
* <li>On the startup command line, set the system property
* {@code org.apache.commons.logging.log} to the name of the
@@ -47,7 +49,7 @@
* <li>At runtime, call {@code LogSource.setLogImplementation()}.</li>
* </ul>
*
- * @deprecated Use {@link LogFactory} instead - The default factory
+ * @deprecated Use {@link LogFactory} instead. The default factory
* implementation performs exactly the same algorithm as this class did
*/
@Deprecated
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/commons-logging-1.3.6-src/src/main/java/org/apache/commons/logging/impl/AvalonLogger.java
new/commons-logging-1.4.0-src/src/main/java/org/apache/commons/logging/impl/AvalonLogger.java
---
old/commons-logging-1.3.6-src/src/main/java/org/apache/commons/logging/impl/AvalonLogger.java
2026-03-05 00:05:20.000000000 +0100
+++
new/commons-logging-1.4.0-src/src/main/java/org/apache/commons/logging/impl/AvalonLogger.java
2026-06-11 22:45:24.000000000 +0200
@@ -27,6 +27,7 @@
* logging calls to the Avalon logging abstraction: the Logger interface.
* <p>
* There are two ways in which this class can be used:
+ * </p>
* <ul>
* <li>the instance can be constructed with an Avalon logger
* (by calling {@link #AvalonLogger(Logger)}). In this case, it acts
@@ -48,6 +49,7 @@
* commons-logging, but this never actually worked (a NullPointerException
would
* be thrown as soon as the deserialized object was used), so removing this
marker
* is not considered to be an incompatible change.
+ * </p>
*
* @deprecated Scheduled for removal because the Apache Avalon Project has
been discontinued.
*/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/commons-logging-1.3.6-src/src/main/java/org/apache/commons/logging/impl/Log4JLogger.java
new/commons-logging-1.4.0-src/src/main/java/org/apache/commons/logging/impl/Log4JLogger.java
---
old/commons-logging-1.3.6-src/src/main/java/org/apache/commons/logging/impl/Log4JLogger.java
2026-03-05 00:05:20.000000000 +0100
+++
new/commons-logging-1.4.0-src/src/main/java/org/apache/commons/logging/impl/Log4JLogger.java
2026-06-11 22:45:24.000000000 +0200
@@ -30,16 +30,20 @@
* <p>
* Initial configuration of the corresponding Logger instances should be done
* in the usual manner, as outlined in the Log4J documentation.
+ * </p>
* <p>
* The reason this logger is distinct from the 1.3.0 logger is that in version
1.2
* of Log4J:
+ * </p>
* <ul>
* <li>class Logger takes Priority parameters not Level parameters.</li>
* <li>class Level extends Priority</li>
* </ul>
+ * <p>
* Log4j 1.3 is expected to change Level so it no longer extends Priority,
which is
* a non-binary-compatible change. The class generated by compiling this code
against
* Log4j 1.2 will therefore not run against Log4j 1.3.
+ * </p>
*
* @deprecated Scheduled for removal since version 1.x of Log4j has reached
end-of-life.
*/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/commons-logging-1.3.6-src/src/main/java/org/apache/commons/logging/impl/ServletContextCleaner.java
new/commons-logging-1.4.0-src/src/main/java/org/apache/commons/logging/impl/ServletContextCleaner.java
---
old/commons-logging-1.3.6-src/src/main/java/org/apache/commons/logging/impl/ServletContextCleaner.java
2026-03-05 00:05:20.000000000 +0100
+++
new/commons-logging-1.4.0-src/src/main/java/org/apache/commons/logging/impl/ServletContextCleaner.java
2026-06-11 22:45:24.000000000 +0200
@@ -38,11 +38,13 @@
* some rare cases where the WeakHashtable approach does not work; in these
* situations specifying this class as a listener for the web application will
* ensure that all references held by commons-logging are fully released.
+ * </p>
* <p>
* To use this class, configure the webapp deployment descriptor to call
* this class on webapp undeploy; the contextDestroyed method will tell
* every accessible LogFactory class that the entry in its map for the
* current webapp's context class loader should be cleared.
+ * </p>
*
* @since 1.1
*/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/commons-logging-1.3.6-src/src/main/java/org/apache/commons/logging/jakarta/ServletContextCleaner.java
new/commons-logging-1.4.0-src/src/main/java/org/apache/commons/logging/jakarta/ServletContextCleaner.java
---
old/commons-logging-1.3.6-src/src/main/java/org/apache/commons/logging/jakarta/ServletContextCleaner.java
1970-01-01 01:00:00.000000000 +0100
+++
new/commons-logging-1.4.0-src/src/main/java/org/apache/commons/logging/jakarta/ServletContextCleaner.java
2026-06-11 22:45:24.000000000 +0200
@@ -0,0 +1,135 @@
+/*
+ * 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
+ *
+ * https://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.
+ */
+
+package org.apache.commons.logging.jakarta;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import jakarta.servlet.ServletContextEvent;
+import jakarta.servlet.ServletContextListener;
+
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * This class is capable of receiving notifications about the undeployment of
a webapp, and responds by ensuring that commons-logging releases all memory
+ * associated with the undeployed webapp.
+ * <p>
+ * In general, we ensurs that logging classes do not hold references that
prevent an undeployed webapp's memory from being garbage-collected even when
multiple
+ * copies of commons-logging are deployed via multiple class loaders (a
situation that earlier versions had problems with). However there are some rare
cases
+ * where the this approach does not work; in these situations specifying this
class as a listener for the web application will ensure that all
+ * references held by commons-logging are fully released.
+ * </p>
+ * <p>
+ * To use this class, configure the webapp deployment descriptor to call this
class on webapp undeploy; the contextDestroyed method will tell every accessible
+ * LogFactory class that the entry in its map for the current webapp's context
class loader should be cleared.
+ * </p>
+ *
+ * @since 1.4.0
+ */
+public class ServletContextCleaner implements ServletContextListener {
+
+ private static final Class<?>[] RELEASE_SIGNATURE = { ClassLoader.class };
+
+ /**
+ * Constructs a new instance.
+ */
+ public ServletContextCleaner() {
+ // empty
+ }
+
+ /**
+ * Invoked when a webapp is undeployed, this tells the LogFactory class to
release any logging information related to the current contextClassloader.
+ */
+ @Override
+ public void contextDestroyed(final ServletContextEvent sce) {
+ final ClassLoader tccl =
Thread.currentThread().getContextClassLoader();
+ final Object[] params = new Object[1];
+ params[0] = tccl;
+ // Walk up the tree of class loaders, finding all the available
+ // LogFactory classes and releasing any objects associated with
+ // the tccl (ie the webapp).
+ //
+ // When there is only one LogFactory in the classpath, and it
+ // is within the webapp being undeployed then there is no problem;
+ // garbage collection works fine.
+ //
+ // When there are multiple LogFactory classes in the classpath but
+ // parent-first classloading is used everywhere, this loop is really
+ // short. The first instance of LogFactory found will
+ // be the highest in the classpath, and then no more will be found.
+ // This is ok, as with this setup this will be the only LogFactory
+ // holding any data associated with the tccl being released.
+ //
+ // When there are multiple LogFactory classes in the classpath and
+ // child-first classloading is used in any class loader, then multiple
+ // LogFactory instances may hold info about this TCCL; whenever the
+ // webapp makes a call into a class loaded via an ancestor class loader
+ // and that class calls LogFactory the tccl gets registered in
+ // the LogFactory instance that is visible from the ancestor
+ // class loader. However the concrete logging library it points
+ // to is expected to have been loaded via the TCCL, so the7
+ // underlying logging lib is only initialized/configured once.
+ // These references from ancestor LogFactory classes down to
+ // TCCL class loaders are held via weak references and so should
+ // be released but there are circumstances where they may not.
+ // Walking up the class loader ancestry ladder releasing
+ // the current tccl at each level tree, though, will definitely
+ // clear any problem references.
+ ClassLoader loader = tccl;
+ while (loader != null) {
+ // Load via the current loader. Note that if the class is not
accessible
+ // via this loader, but is accessible via some ancestor then that
class
+ // will be returned.
+ try {
+ @SuppressWarnings("unchecked")
+ final Class<LogFactory> logFactoryClass = (Class<LogFactory>)
loader.loadClass("org.apache.commons.logging.LogFactory");
+ final Method releaseMethod =
logFactoryClass.getMethod("release", RELEASE_SIGNATURE);
+ releaseMethod.invoke(null, params);
+ loader = logFactoryClass.getClassLoader().getParent();
+ } catch (final ClassNotFoundException ex) {
+ // Neither the current class loader nor any of its ancestors
could find
+ // the LogFactory class, so we can stop now.
+ loader = null;
+ } catch (final NoSuchMethodException ex) {
+ // This is not expected; every version of JCL has this method
+ System.err.println("LogFactory instance found which does not
support release method!");
+ loader = null;
+ } catch (final IllegalAccessException ex) {
+ // This is not expected; every ancestor class should be
accessible
+ System.err.println("LogFactory instance found which is not
accessible!");
+ loader = null;
+ } catch (final InvocationTargetException ex) {
+ // This is not expected
+ System.err.println("LogFactory instance release method
failed!");
+ loader = null;
+ }
+ }
+ // Just to be sure, invoke release on the LogFactory that is visible
from
+ // this ServletContextCleaner class too. This should already have been
caught
+ // by the above loop but just in case...
+ LogFactory.release(tccl);
+ }
+
+ /**
+ * Invoked when a webapp is deployed. Nothing needs to be done here.
+ */
+ @Override
+ public void contextInitialized(final ServletContextEvent sce) {
+ // do nothing
+ }
+}
Binary files
old/commons-logging-1.3.6-src/src/media/commons-logo-component-100.xcf and
new/commons-logging-1.4.0-src/src/media/commons-logo-component-100.xcf differ
Binary files old/commons-logging-1.3.6-src/src/media/commons-logo-component.xcf
and new/commons-logging-1.4.0-src/src/media/commons-logo-component.xcf differ
Binary files old/commons-logging-1.3.6-src/src/media/logo.png and
new/commons-logging-1.4.0-src/src/media/logo.png differ
Binary files old/commons-logging-1.3.6-src/src/media/logo.xcf and
new/commons-logging-1.4.0-src/src/media/logo.xcf differ
Binary files old/commons-logging-1.3.6-src/src/site/resources/images/logo.png
and new/commons-logging-1.4.0-src/src/site/resources/images/logo.png differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/commons-logging-1.3.6-src/src/site/xdoc/building.xml
new/commons-logging-1.4.0-src/src/site/xdoc/building.xml
--- old/commons-logging-1.3.6-src/src/site/xdoc/building.xml 2026-03-05
00:05:20.000000000 +0100
+++ new/commons-logging-1.4.0-src/src/site/xdoc/building.xml 2026-06-11
22:45:24.000000000 +0200
@@ -58,7 +58,7 @@
</p>
<p>
Further details can be found in the
- <a href="https//commons.apache.org/building.html">commons build
instructions</a>.
+ <a href="https://commons.apache.org/building.html">commons build
instructions</a>.
</p>
</section>
<!-- ================================================== -->
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/commons-logging-1.3.6-src/src/site/xdoc/download_logging.xml
new/commons-logging-1.4.0-src/src/site/xdoc/download_logging.xml
--- old/commons-logging-1.3.6-src/src/site/xdoc/download_logging.xml
2026-03-05 00:05:20.000000000 +0100
+++ new/commons-logging-1.4.0-src/src/site/xdoc/download_logging.xml
2026-06-11 22:45:24.000000000 +0200
@@ -115,32 +115,32 @@
</p>
</subsection>
</section>
- <section name="Apache Commons Logging 1.3.6 ">
+ <section name="Apache Commons Logging 1.4.0 ">
<subsection name="Binaries">
<table>
<tr>
- <td><a
href="[preferred]/commons/logging/binaries/commons-logging-1.3.6-bin.tar.gz">commons-logging-1.3.6-bin.tar.gz</a></td>
- <td><a
href="https://downloads.apache.org/commons/logging/binaries/commons-logging-1.3.6-bin.tar.gz.sha512">sha512</a></td>
- <td><a
href="https://downloads.apache.org/commons/logging/binaries/commons-logging-1.3.6-bin.tar.gz.asc">pgp</a></td>
+ <td><a
href="[preferred]/commons/logging/binaries/commons-logging-1.4.0-bin.tar.gz">commons-logging-1.4.0-bin.tar.gz</a></td>
+ <td><a
href="https://downloads.apache.org/commons/logging/binaries/commons-logging-1.4.0-bin.tar.gz.sha512">sha512</a></td>
+ <td><a
href="https://downloads.apache.org/commons/logging/binaries/commons-logging-1.4.0-bin.tar.gz.asc">pgp</a></td>
</tr>
<tr>
- <td><a
href="[preferred]/commons/logging/binaries/commons-logging-1.3.6-bin.zip">commons-logging-1.3.6-bin.zip</a></td>
- <td><a
href="https://downloads.apache.org/commons/logging/binaries/commons-logging-1.3.6-bin.zip.sha512">sha512</a></td>
- <td><a
href="https://downloads.apache.org/commons/logging/binaries/commons-logging-1.3.6-bin.zip.asc">pgp</a></td>
+ <td><a
href="[preferred]/commons/logging/binaries/commons-logging-1.4.0-bin.zip">commons-logging-1.4.0-bin.zip</a></td>
+ <td><a
href="https://downloads.apache.org/commons/logging/binaries/commons-logging-1.4.0-bin.zip.sha512">sha512</a></td>
+ <td><a
href="https://downloads.apache.org/commons/logging/binaries/commons-logging-1.4.0-bin.zip.asc">pgp</a></td>
</tr>
</table>
</subsection>
<subsection name="Source">
<table>
<tr>
- <td><a
href="[preferred]/commons/logging/source/commons-logging-1.3.6-src.tar.gz">commons-logging-1.3.6-src.tar.gz</a></td>
- <td><a
href="https://downloads.apache.org/commons/logging/source/commons-logging-1.3.6-src.tar.gz.sha512">sha512</a></td>
- <td><a
href="https://downloads.apache.org/commons/logging/source/commons-logging-1.3.6-src.tar.gz.asc">pgp</a></td>
+ <td><a
href="[preferred]/commons/logging/source/commons-logging-1.4.0-src.tar.gz">commons-logging-1.4.0-src.tar.gz</a></td>
+ <td><a
href="https://downloads.apache.org/commons/logging/source/commons-logging-1.4.0-src.tar.gz.sha512">sha512</a></td>
+ <td><a
href="https://downloads.apache.org/commons/logging/source/commons-logging-1.4.0-src.tar.gz.asc">pgp</a></td>
</tr>
<tr>
- <td><a
href="[preferred]/commons/logging/source/commons-logging-1.3.6-src.zip">commons-logging-1.3.6-src.zip</a></td>
- <td><a
href="https://downloads.apache.org/commons/logging/source/commons-logging-1.3.6-src.zip.sha512">sha512</a></td>
- <td><a
href="https://downloads.apache.org/commons/logging/source/commons-logging-1.3.6-src.zip.asc">pgp</a></td>
+ <td><a
href="[preferred]/commons/logging/source/commons-logging-1.4.0-src.zip">commons-logging-1.4.0-src.zip</a></td>
+ <td><a
href="https://downloads.apache.org/commons/logging/source/commons-logging-1.4.0-src.zip.sha512">sha512</a></td>
+ <td><a
href="https://downloads.apache.org/commons/logging/source/commons-logging-1.4.0-src.zip.asc">pgp</a></td>
</tr>
</table>
</subsection>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/commons-logging-1.3.6-src/src/site/xdoc/index.xml
new/commons-logging-1.4.0-src/src/site/xdoc/index.xml
--- old/commons-logging-1.3.6-src/src/site/xdoc/index.xml 2026-03-05
00:05:20.000000000 +0100
+++ new/commons-logging-1.4.0-src/src/site/xdoc/index.xml 2026-06-11
22:45:24.000000000 +0200
@@ -61,13 +61,13 @@
Release Notes</a> document the new features and bug fixes that have been
included in the latest release.</p>
-<p>The <a href="https//commons.apache.org/logging/apidocs/index.html">
+<p>The <a href="https://commons.apache.org/logging/apidocs/index.html">
Javadoc API documents</a> for the latest release are available online.
In particular, you should read the package overview of the
<code>org.apache.commons.logging</code>
package. In addition, there is a (short)
<a href="guide.html">User Guide</a>.</p>
-<p>The <a href="https//wiki.apache.org/commons/Logging">Wiki site</a> has
+<p>The <a href="https://wiki.apache.org/commons/Logging">Wiki site</a> has
the latest updates, an FAQ, and much other useful information.</p>
<p>
Users needing to become experts or wanting to help develop JCL should
@@ -80,7 +80,7 @@
<section name="Releases">
<p>
Binary and source distributions are available
- <a
href="https//commons.apache.org/proper/commons-logging/download_logging.cgi">here</a>.
+ <a
href="https://commons.apache.org/proper/commons-logging/download_logging.cgi">here</a>.
</p>
<p>
The full release history is <a href="changes.html">here</a>.
@@ -148,7 +148,7 @@
<section name="Development Builds">
<p>Regular builds of the current Git <code>master</code> branch code are
made available in the
<a
href="https://repository.apache.org/content/repositories/snapshots/">snapshot
repository</a>. See the
- <a href="https//wiki.apache.org/commons/Logging">wiki</a> for details.</p>
+ <a href="https://wiki.apache.org/commons/Logging">wiki</a> for details.</p>
</section>
</body>
</document>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/commons-logging-1.3.6-src/src/site/xdoc/proposal.xml
new/commons-logging-1.4.0-src/src/site/xdoc/proposal.xml
--- old/commons-logging-1.3.6-src/src/site/xdoc/proposal.xml 2026-03-05
00:05:20.000000000 +0100
+++ new/commons-logging-1.4.0-src/src/site/xdoc/proposal.xml 2026-06-11
22:45:24.000000000 +0200
@@ -85,7 +85,7 @@
is selected at runtime).</li>
<li>Log4J (compile-time dependency only unless this Log
implementation is selected at runtime)</li>
- <li><a href="https//sourceforge.net/projects/lumberjack/">Lumberjack</a>
+ <li><a href="https://sourceforge.net/projects/lumberjack/">Lumberjack</a>
(compile-time dependency only unless this Log
implementation is selected at runtime)</li>
</ul>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/commons-logging-1.3.6-src/src/site/xdoc/security.xml
new/commons-logging-1.4.0-src/src/site/xdoc/security.xml
--- old/commons-logging-1.3.6-src/src/site/xdoc/security.xml 2026-03-05
00:05:20.000000000 +0100
+++ new/commons-logging-1.4.0-src/src/site/xdoc/security.xml 2026-06-11
22:45:24.000000000 +0200
@@ -47,5 +47,10 @@
<section name="Security Vulnerabilities">
<p>None.</p>
</section>
+ <section name="Safe Deserialization">
+ <p>
+ For information about safe deserialization, please see <a
href="https://commons.apache.org/io/description.html#Safe_Deserialization">Safe
Deserialization</a>.
+ </p>
+ </section>
</body>
</document>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/commons-logging-1.3.6-src/src/site/xdoc/tech.xml
new/commons-logging-1.4.0-src/src/site/xdoc/tech.xml
--- old/commons-logging-1.3.6-src/src/site/xdoc/tech.xml 2026-03-05
00:05:20.000000000 +0100
+++ new/commons-logging-1.4.0-src/src/site/xdoc/tech.xml 2026-06-11
22:45:24.000000000 +0200
@@ -184,10 +184,10 @@
</p>
<ul>
<li>
- posting to the <a href='https//commons.apache.org/mail-lists.html'>Apache
Commons dev mailing list</a> or
+ posting to the <a href='https://commons.apache.org/mail-lists.html'>Apache
Commons dev mailing list</a> or
</li>
<li>
- creating an issue in <a
href='https//issues.apache.org/jira/browse/LOGGING/'>JIRA</a>.
+ creating an issue in <a
href='https://issues.apache.org/jira/browse/LOGGING/'>JIRA</a>.
</li>
</ul>
<p>
@@ -218,7 +218,7 @@
</subsection>
<subsection name='Resolution Of Symbolic References'>
<p>
- (<a
href='https//java.sun.com/docs/books/jls/second_edition/html/execution.doc.html#44524'>LangSpec
12.3.3</a>)
+ (<a
href='https://java.sun.com/docs/books/jls/second_edition/html/execution.doc.html#44524'>LangSpec
12.3.3</a>)
The bytecode representation of a class contains symbolic names for other
classes referenced.
</p>
<p>
@@ -228,7 +228,7 @@
</em>
</p>
<p>
- (<a
href='https//java.sun.com/docs/books/vmspec/2nd-edition/html/ConstantPool.doc.html#73492'>VMSpec
5.4.3</a>)
+ (<a
href='https://java.sun.com/docs/books/vmspec/2nd-edition/html/ConstantPool.doc.html#73492'>VMSpec
5.4.3</a>)
Resolution of a symbolic reference occurs dynamically at runtime and is
carried out by
the Java Virtual Machine. Resolution of a symbolic reference requires
loading and linking of the new class.
</p>
@@ -240,7 +240,7 @@
</subsection>
<subsection name='Loading'>
<p>
- (<a
href='https//java.sun.com/docs/books/vmspec/2nd-edition/html/Concepts.doc.html#19175'>VMSpec
2.17.2</a>)
+ (<a
href='https://java.sun.com/docs/books/vmspec/2nd-edition/html/Concepts.doc.html#19175'>VMSpec
2.17.2</a>)
Loading is the name given to the process by which a binary form of a class
is obtained
by the Java Virtual Machine.
Java classes are always loaded and linked dynamically by the Java Virtual
Machine
@@ -257,12 +257,12 @@
</subsection>
<subsection name='Linking'>
<p>
- (<a
href='https//java.sun.com/docs/books/vmspec/2nd-edition/html/Concepts.doc.html#22574'>VMSpec
2.17.3</a>)
+ (<a
href='https://java.sun.com/docs/books/vmspec/2nd-edition/html/Concepts.doc.html#22574'>VMSpec
2.17.3</a>)
Linking is the name used for combining the
binary form of a class into the Java Virtual Machine. This must happen
before the class can be used.
</p>
<p>
- (<a
href='https//java.sun.com/docs/books/vmspec/2nd-edition/html/Concepts.doc.html#22574'>VMSpec
2.17.3</a>)
+ (<a
href='https://java.sun.com/docs/books/vmspec/2nd-edition/html/Concepts.doc.html#22574'>VMSpec
2.17.3</a>)
Linking is composed of verification, preparation and resolution (of symbolic
references).
Flexibility is allowed over the timing of resolution. (Within limit) this
may happen at any time after
preparation and before that reference is used.
@@ -279,11 +279,11 @@
<subsection name='Loading Classes'>
<p>
- (<a
href='https//java.sun.com/docs/books/vmspec/2nd-edition/html/Concepts.doc.html#19175'>VMSpec
2.17.2</a>)
+ (<a
href='https://java.sun.com/docs/books/vmspec/2nd-edition/html/Concepts.doc.html#19175'>VMSpec
2.17.2</a>)
The loading process is performed by a <code>ClassLoader</code>.
</p>
<p>
- (<a
href='https//java.sun.com/docs/books/vmspec/2nd-edition/html/ConstantPool.doc.html#72007'>VMSpec
5.3</a>)
+ (<a
href='https://java.sun.com/docs/books/vmspec/2nd-edition/html/ConstantPool.doc.html#72007'>VMSpec
5.3</a>)
A classloader may create a class either by delegation or by defining it
directly.
The classloader that initiates loading of a class is known as the initiating
loader.
The classloader that defines the class is known as the defining loader.
@@ -298,7 +298,7 @@
<subsection name='Bootstrap Classloader'>
<p>
- (<a
href='https//java.sun.com/docs/books/vmspec/2nd-edition/html/ConstantPool.doc.html#72007'>VMSPEC
5.3</a>)
+ (<a
href='https://java.sun.com/docs/books/vmspec/2nd-edition/html/ConstantPool.doc.html#72007'>VMSPEC
5.3</a>)
The bootstrap is the base <code>ClassLoader</code> supplied by the Java
Virtual Machine.
All others are user (also known as application) <code>ClassLoader</code>
instances.
</p>
@@ -313,12 +313,12 @@
</subsection>
<subsection name='Runtime Package'>
<p>
- (<a
href='https//java.sun.com/docs/books/vmspec/2nd-edition/html/ConstantPool.doc.html#72007'>VMSpec
5.3</a>)
+ (<a
href='https://java.sun.com/docs/books/vmspec/2nd-edition/html/ConstantPool.doc.html#72007'>VMSpec
5.3</a>)
At runtime, a class (or interface) is determined by its fully qualified name
and by the classloader that defines it. This is known as the class's runtime
package.
</p>
<p>
- (<a
href='https//java.sun.com/docs/books/vmspec/2nd-edition/html/ConstantPool.doc.html#75929'>VMSpec
5.4.4</a>)
+ (<a
href='https://java.sun.com/docs/books/vmspec/2nd-edition/html/ConstantPool.doc.html#75929'>VMSpec
5.4.4</a>)
Only classes in the same runtime package are mutually accessible.
</p>
<p>
@@ -335,7 +335,7 @@
<subsection name='Loader Used To Resolve A Symbolic Reference'>
<p>
- (<a
href='https//java.sun.com/docs/books/vmspec/2nd-edition/html/ConstantPool.doc.html#72007'>VMSpec
5.3</a>)
+ (<a
href='https://java.sun.com/docs/books/vmspec/2nd-edition/html/ConstantPool.doc.html#72007'>VMSpec
5.3</a>)
The classloader which defines the class (whose reference is being resolved)
is the one
used to initiate loading of the class referred to.
</p>
@@ -353,10 +353,10 @@
<subsection name='Bibliography'>
<ul>
<li>
- <a href='https//java.sun.com/docs/books/vmspec/'>VMSpec</a> <em>The Java
Virtual Machine Specification, Second Edition</em>
+ <a href='https://java.sun.com/docs/books/vmspec/'>VMSpec</a> <em>The Java
Virtual Machine Specification, Second Edition</em>
</li>
<li>
- <a href='https//java.sun.com/docs/books/jls/'>LangSpec</a> <em>The Java
Language Specification, Second Edition</em>
+ <a href='https://java.sun.com/docs/books/jls/'>LangSpec</a> <em>The Java
Language Specification, Second Edition</em>
</li>
</ul>
</subsection>
@@ -444,7 +444,7 @@
<subsection name='The Context Classloader in Container Applications'>
<p>
The Javadoc for
- <a
href="https//java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setContextClassLoader(java.lang.ClassLoader)">
+ <a
href="https://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setContextClassLoader(java.lang.ClassLoader)">
<code>Thread.setContextClassLoader</code></a> emphasizes the setting of the
context classloader as an aspect of thread creation. However, in many
applications the context classloader is not fixed at thread creation but
@@ -509,7 +509,7 @@
Again, this will cause difficulties.
</p>
<p>
- Introduced in <a href='https//java.sun.com/j2ee/j2ee-1_3-fr-spec.pdf'>Java
J2EE 1.3</a>
+ Introduced in <a href='https://java.sun.com/j2ee/j2ee-1_3-fr-spec.pdf'>Java
J2EE 1.3</a>
is a requirement for vendors to appropriately set the context classloader.
Section 6.2.4.8 (1.4 text):
</p>
@@ -570,19 +570,19 @@
<ul>
<li>
<a
- href='https//www.onjava.com/pub/a/onjava/2001/07/25/ejb.html'>
+ href='https://www.onjava.com/pub/a/onjava/2001/07/25/ejb.html'>
Article on J2EE class loading
</a>
</li>
<li>
<a
- href='https//www.onjava.com/pub/a/onjava/2003/11/12/classloader.html'>
+ href='https://www.onjava.com/pub/a/onjava/2003/11/12/classloader.html'>
Article on class loading
</a>
</li>
<li>
<a
-
href='https//www.javaworld.com/javaworld/javaqa/2003-06/01-qa-0606-load.html'>
+
href='https://www.javaworld.com/javaworld/javaqa/2003-06/01-qa-0606-load.html'>
Article on context class loaders
</a>
</li>
@@ -592,19 +592,19 @@
<ul>
<li>
<a
- href='https//tomcat.apache.org/tomcat-4.1-doc/class-loader-howto.html'>
+ href='https://tomcat.apache.org/tomcat-4.1-doc/class-loader-howto.html'>
Tomcat 4.1 ClassLoader Guide
</a>
</li>
<li>
<a
- href='https//tomcat.apache.org/tomcat-5.0-doc/class-loader-howto.html'>
+ href='https://tomcat.apache.org/tomcat-5.0-doc/class-loader-howto.html'>
Tomcat 5.0 ClassLoader Guide
</a>
</li>
<li>
<a
-href='https//publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/trun_classload_web.html'>
+href='https://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/trun_classload_web.html'>
Classloading In WebSphere
</a>
</li>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/commons-logging-1.3.6-src/src/site/xdoc/troubleshooting.xml
new/commons-logging-1.4.0-src/src/site/xdoc/troubleshooting.xml
--- old/commons-logging-1.3.6-src/src/site/xdoc/troubleshooting.xml
2026-03-05 00:05:20.000000000 +0100
+++ new/commons-logging-1.4.0-src/src/site/xdoc/troubleshooting.xml
2026-06-11 22:45:24.000000000 +0200
@@ -288,8 +288,8 @@
Containers known to use this mechanism:
</p>
<ul>
- <li><a href='https//www.ibm.com/software/websphere/'>WebSphere
Application Server</a> from
- <a href='https//www.ibm.com/software/websphere/'>IBM</a> (versions 5 and
6).</li>
+ <li><a href='https://www.ibm.com/software/websphere/'>WebSphere
Application Server</a> from
+ <a href='https://www.ibm.com/software/websphere/'>IBM</a> (versions 5
and 6).</li>
</ul>
<p>
Containers suspected to use this mechanism:
@@ -312,10 +312,10 @@
implementation should be used but Class
'com.ibm.ws.commons.logging.TrLogFactory' cannot be converted
to 'org.apache.commons.logging.LogFactory'. The conflict is caused by the
presence of multiple
LogFactory classes in incompatible classloaders. Background can be found in
- https//commons.apache.org/logging/tech.html. If you have not explicitly
specified a custom
+ https://commons.apache.org/logging/tech.html. If you have not explicitly
specified a custom
LogFactory then it is likely that the container has set one without your
knowledge.
In this case, consider using the commons-logging-adapters.jar file or
specifying the standard
- LogFactory from the command line. Help can be found
@https//commons.apache.org/logging.
+ LogFactory from the command line. Help can be found
@https://commons.apache.org/logging.
</code>
<p>
This is a WebSphere example so the name of the custom LogFactory is
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/commons-logging-1.3.6-src/src/test/java/org/apache/commons/logging/servlet/BasicJakartaServletTestCase.java
new/commons-logging-1.4.0-src/src/test/java/org/apache/commons/logging/servlet/BasicJakartaServletTestCase.java
---
old/commons-logging-1.3.6-src/src/test/java/org/apache/commons/logging/servlet/BasicJakartaServletTestCase.java
1970-01-01 01:00:00.000000000 +0100
+++
new/commons-logging-1.4.0-src/src/test/java/org/apache/commons/logging/servlet/BasicJakartaServletTestCase.java
2026-06-11 22:45:24.000000000 +0200
@@ -0,0 +1,70 @@
+/*
+ * 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
+ *
+ * https://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.
+ */
+
+package org.apache.commons.logging.servlet;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+
+import org.apache.commons.logging.PathableClassLoader;
+import org.apache.commons.logging.PathableTestSuite;
+import org.apache.commons.logging.jakarta.ServletContextCleaner;
+
+/**
+ * Tests for ServletContextCleaner utility class.
+ */
+public class BasicJakartaServletTestCase extends TestCase {
+
+ /**
+ * Return the tests included in this test suite.
+ */
+ public static Test suite() throws Exception {
+ // LogFactory in parent
+ // LogFactory in child (loads test)
+ // LogFactory in tccl
+ //
+ // Having the test loaded via a loader above the tccl emulates the
situation
+ // where a web.xml file specifies ServletContextCleaner as a listener,
and
+ // that class is deployed via a shared class loader.
+
+ final PathableClassLoader parent = new PathableClassLoader(null);
+ parent.useExplicitLoader("junit.", Test.class.getClassLoader());
+ parent.addLogicalLib("commons-logging");
+ parent.addLogicalLib("jakarta-servlet-api");
+
+ final PathableClassLoader child = new PathableClassLoader(parent);
+ child.setParentFirst(false);
+ child.addLogicalLib("commons-logging");
+ child.addLogicalLib("testclasses");
+
+ final PathableClassLoader tccl = new PathableClassLoader(child);
+ tccl.setParentFirst(false);
+ tccl.addLogicalLib("commons-logging");
+
+ final Class<?> testClass =
child.loadClass(BasicJakartaServletTestCase.class.getName());
+ return new PathableTestSuite(testClass, tccl);
+ }
+
+ /**
+ * Test that calling ServletContextCleaner.contextDestroyed doesn't crash.
+ * Testing anything else is rather difficult...
+ */
+ public void testBasics() {
+ final ServletContextCleaner scc = new ServletContextCleaner();
+ scc.contextDestroyed(null);
+ }
+}