# Generated by org.codehaus.mojo.license.AddThirdPartyMojo
#-------------------------------------------------------------------------------
# Already used licenses in project :
# - Apache Software License
# - Apache Software License, Version 2.0
# - BSD License
# - BSD-style
# - Common Development And Distribution License (CDDL), Version 1.0
# - Common Development And Distribution License (CDDL), Version 1.1
# - Common Public License, Version 1.0
# - Eclipse Public License, Version 1.0
# - GNU General Public License (GPL), Version 2 with classpath exception
# - GNU Lesser General Public License (LGPL)
# - GNU Lesser General Public License (LGPL), Version 2.1
# - ICU License
# - MIT License
# - Public Domain License
#-------------------------------------------------------------------------------
# Please fill the missing licenses for dependencies :
#
#
#Sun Oct 07 16:38:47 CEST 2012
antlr--antlr--2.7.2=Public Domain
asm--asm--3.1=BSD License
commons-beanutils--commons-beanutils--1.7.0=The Apache Software License, Version 2.0
dom4j--dom4j--1.1=BSD-style
jakarta-regexp--jakarta-regexp--1.4=The Apache Software License, Version 2.0
javax.portlet--portlet-api--2.0=The Apache Software License, Version 2.0
javax.servlet--servlet-api--2.5=Common Development And Distribution License (CDDL), Version 1.0
org.apache.zookeeper--zookeeper--3.3.1=The Apache Software License, Version 2.0
org.codehaus.jettison--jettison--1.3=The Apache Software License, Version 2.0
org.osgi--org.osgi.compendium--4.1.0=The Apache Software License, Version 2.0
org.osgi--org.osgi.core--4.1.0=The Apache Software License, Version 2.0
oro--oro--2.0.8=The Apache Software License, Version 2.0
xerces--xercesImpl--2.7.1=The Apache Software License, Version 2.0
