<!--

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.

-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<parent>
        <groupId>org.apache.flex.blazeds</groupId>
		<artifactId>blazeds</artifactId>
		<version>4.7.3-SNAPSHOT</version>
		<relativePath>../pom.xml</relativePath>
	</parent>

	<artifactId>flex-messaging-opt</artifactId>
	<packaging>pom</packaging>

	<modules>
	    <module>poms/tomcat7</module>
		<module>poms/tomcat6</module>
		<module>poms/tomcat4</module>
        <!-- TODO: Commented out these project as they have third-party dependencies that might be problematic. -->
		<!--module>poms/websphere</module-->
		<!--module>poms/weblogic</module-->
		<!--module>poms/oracle</module-->
		<!--module>poms/jrun</module-->
	</modules>

	<dependencies>
		<dependency>
            <groupId>org.apache.flex.blazeds</groupId>
			<artifactId>flex-messaging-core</artifactId>
			<version>${project.version}</version>
		</dependency>

		<dependency>
			<groupId>commons-httpclient</groupId>
			<artifactId>commons-httpclient</artifactId>
			<version>3.0.1</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.2</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
    	<resources>
			<resource>
				<filtering>false</filtering>
				<directory>${basedir}/../../src/properties</directory>
			</resource>
		</resources>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.0.2</version>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
					<excludes>
						<exclude>${exclude.pattern.1}</exclude>
						<exclude>${exclude.pattern.2}</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
