<!--

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>flex-messaging-opt</artifactId>
		<version>4.7.0-SNAPSHOT</version>
		<relativePath>../../pom.xml</relativePath>
	</parent>

	<artifactId>flex-messaging-opt-weblogic</artifactId>

	<distributionManagement>
		<site>
			<id>blazeds_mvn_site</id>
			<url>${maven.site.local.url}/flex-messaging-opt/${project.artifactId}</url>
		</site>
	</distributionManagement>

	<dependencies>
		<dependency>
			<groupId>com.weblogic</groupId>
			<artifactId>wsexception</artifactId>
			<version>7.0.5.0</version>
			<scope>system</scope>
			<systemPath>${basedir}/../../lib/wsexception.jar</systemPath>
		</dependency>
		<dependency>
			<groupId>com.weblogic</groupId>
			<artifactId>weblogic</artifactId>
			<version>7.0.5.0</version>
			<scope>system</scope>
			<systemPath>${basedir}/../../lib/weblogic.jar</systemPath>
		</dependency>
	</dependencies>

    <properties>
		<appserver>weblogic</appserver>
		<source.dir>src/weblogic</source.dir>
		<exclude.pattern>none</exclude.pattern>
	</properties>

</project>
