# Notices for Eclipse GlassFish

This content is produced and maintained by the Eclipse GlassFish project.

* Project home: https://projects.eclipse.org/projects/ee4j.glassfish

## Trademarks

Eclipse GlassFish, and GlassFish are trademarks of the Eclipse Foundation.

## Copyright

All content is the property of the respective authors or their employers. For
more information regarding authorship of content, please consult the listed
source code repository logs.

## Declared Project Licenses

This program and the accompanying materials are made available under the terms
of the Eclipse Public License v. 2.0 which is available at
http://www.eclipse.org/legal/epl-2.0. This Source Code may also be made
available under the following Secondary Licenses when the conditions for such
availability set forth in the Eclipse Public License v. 2.0 are satisfied: GNU
General Public License, version 2 with the GNU Classpath Exception which is
available at https://www.gnu.org/software/classpath/license.html.

SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0

## Source Code

The project maintains the following source code repositories:

* https://github.com/eclipse-ee4j/glassfish-ha-api
* https://github.com/eclipse-ee4j/glassfish-logging-annotation-processor
* https://github.com/eclipse-ee4j/glassfish-shoal
* https://github.com/eclipse-ee4j/glassfish-cdi-porting-tck
* https://github.com/eclipse-ee4j/glassfish-jsftemplating
* https://github.com/eclipse-ee4j/glassfish-hk2-extra
* https://github.com/eclipse-ee4j/glassfish-hk2
* https://github.com/eclipse-ee4j/glassfish-fighterfish
* https://github.com/eclipse-ee4j/glassfish
* https://github.com/eclipse-ee4j/glassfish-maven-embedded-plugin
* https://github.com/eclipse-ee4j/bvtck-porting

## Third-party Content

This project leverages the following third party content.

Ant Contrib (1.0)

* License: Apache-1.1 AND Apache-2.0
* Project: http://ant-contrib.sourceforge.net/
* Source: http://ant-contrib.sourceforge.net/

Apache Ant (1.10.1)

* License: Apache License, 2.0, W3C License, Public Domain

Apache Commons BeanUtils (1.9.3)

* License: Apache-2.0

Apache Commons Codec (1.3)

* License: Apache License, 2.0

Apache Commons Digester (2.1)

* License: Apache License, 2.0

Apache Commons HttpClient (3.0.1)

* License: Apache License, 2.0

Apache Felix Gogo Command: (1.0.2)

* License: Apache-2.0

Apache Felix Gogo Runtime: (1.0.10)

* License: Apache-2.0

Apache Felix Gogo Shell: (1.0.0)

* License: Apache-2.0

Apache Felix SCR (Declarative Services) (2.0.12)

* License: Apache-2.0 AND Public-Domain AND MIT

Apache HttpClient (3.1)

* License: Apache License, 2.0

Apache Log4j (1.2.17)

* License: Apache License 2.0

Apache XML Security (1.2.1)

* License: Apache-2.0 AND W3C-19980720 AND Apache-1.1
* Project: http://santuario.apache.org/java121releasenotes.html

ASM (6.0)

* License: BSD-3-Clause

classmate (1.3.3)

* License: Apache-2.0

com.ibm.jbatch.container (1.0.2)

* License: Apache-2.0

com.ibm.jbatch.spi (1.0.2)

* License: Apache-2.0

commons-fileupload (1.3.3)

* License: Apache-2.0

commons-logging-1.1.1.jar (1.1.1)

* License: Apache License, 2.0

Emma (2.1.5320)

* License: CPL-1.0
* Project: http://emma.sourceforge.net/
* Source: http://emma.sourceforge.net/

hibernate-validator (6.0.10)

* License: Apache-2.0 AND LicenseRef-Public-Domain

Jakarta Watchdog Version:4 (n/a)

* License: Apache-1.1

Java Native Access Platform (JNA Platform) (4.5.1)

* License: Apache-2.0 OR LGPL-2.1-or-later

javassist (3.22.0)

* License: Apache-2.0 OR LGPL -2.1+ OR MPL-1.1

jboss-logging (3.3.1)

* License: Apache-2.0

Jettison (1.3.7)

* License: Apache-2.0

jline (2.14.5)

* License: BSD-3-Clause

JSch (0.1.54)

* License: New BSD license

JUnit (4.12)

* License: Eclipse Public License

org.apache.commons.collections (3.2.1)

* License: Apache License 2.0

OSGi Service Platform Core Companion Code (6.0)

* License: Apache License, 2.0

slf4j-api (1.7.25)

* License: MIT

slf4j-simple (1.7.25)

* License: MIT

stax2-api (3.1.4)

* License: BSD-2-Clause

TestNG (6.13.1)

* License: Apache-2.0 AND (MIT OR GPL-1.0+)
* Project: http://testng.org/
* Source: http://testng.org/

woodstox-core-asl (4.4.1)

* License: Apache-2.0

xercesImpl (2.11.0)

* License: Apache-2.0 AND LicenseRef-W3C

## Cryptography

Content may contain encryption software. The country in which you are currently
may have restrictions on the import, possession, and use, and/or re-export to
another country, of encryption software. BEFORE using any encryption software,
please check the country's laws, regulations and policies concerning the import,
possession, or use, and re-export of encryption software, to see if this is
permitted.
