# 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.

javac.compilerargs=-Xlint -Xlint:-serial
javac.source=1.8
module.jar.dir=core
javadoc.main.page=org/openide/filesystems/doc-files/api.html
javadoc.arch=${basedir}/arch.xml
javadoc.apichanges=${basedir}/apichanges.xml
cp.extra=${tools.jar}

test.config.stableBTD.includes=**/*Test.class
test.config.stableBTD.excludes=\
    **/FileChooserBuilderTest.class,\
    **/FileObjectTestHid.class,\
    **/FileUtilTest.class,\
    **/FsMimeResolverTest.class,\
    **/JarFileSystemTest.class,\
    **/LayerBuilderTest.class,\
    **/LayerGenerationExceptionTest.class,\
    **/LocalFileSystemTest.class,\
    **/MemoryFileSystemTest.class,\
    **/MIMEResolverImplTest.class,\
    **/MultiFileSystem1Test.class,\
    **/MultiFileSystem2Test.class,\
    **/MultiFileSystem3Test.class,\
    **/MultiFileSystemXMLTest.class,\
    **/RepositoryTest.class,\
    **/StatFilesTest.class,\
    **/URLMapperTestHidden.class,\
    **/XMLFileSystemTest.class
