#
#  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.


# The properties defined in this file should align with the names of the 
# <property> elements of Pluto's parent POM. This property file is 
# interpolated and placed in the maven-pluto-plugin jar, and is 
# used by the InstallationDependency class.
portals.portlet-api.version=${portals.portlet-api.version}
servlet-api.version=${servlet-api.version}
jsp-api.version=${jsp-api.version}
cdi.version=${cdi.version}
annotation-detector.version=${annotation-detector.version}
slf4j.version=${slf4j.version}
jstl.version=${jstl.version}
taglibs.standard.version=${taglibs.standard.version}
xerces.version=${xerces.version}
xercesImpl.version=${xerces.version}
xmlParserAPIs.version=${xerces.version}
castor.version=${castor.version}
commons-digester.version=${commons-digester.version}
commons-cli.version=${commons-cli.version}
commons-httpclient.version=${commons-httpclient.version}
commons-beanutils.version=${commons-beanutils.version}
commons-logging.version=${commons-logging.version}
log4j.version=${log4j.version}
springframework.version=${springframework.version}
plexus.version=${plexus.version}
maven.version=${maven.version}
ant.version=${ant.version}
junit.version=${junit.version}
jmock.version=${jmock.version}
# The version of Pluto's parent POM.
pluto.version=${pom.version}
#pluto.version=${pom.parent.version}
jaxb.version=${jaxb.version}
jaxb-impl.version=${jaxb-impl.version}
xalan.version=${xalan.version}
activation.version=${activation.version}
stax.api.version=${stax.api.version}
stax.impl.version=${stax.impl.version}
ccpp-api.version=${ccpp-api.version}
ccpp-ri.version=${ccpp-ri.version}
rdffilter.version=${rdffilter.version}
jena.version=${jena.version}
