<!--
  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.
-->
<version>
  2.0.0-SNAPSHOT
</version>

<!--
  To update this list, find modules that have public API packages in src/main. e.g.:

  git grep -l -E 'package org.apache.accumulo.(core.(client|data|security)|minicluster)' . \
      | grep src/main | sed 's%src/main/java/.*%%' | sort -u

  Then check the relevant pom files to see what the artifact is named.
-->
<archives>
  /path/to/accumulo-core-2.0.0-SNAPSHOT.jar
  /path/to/accumulo-minicluster-2.0.0-SNAPSHOT.jar
</archives>

<!--
  To update this list, find packages that are named 'impl', 'thrift', or 'crypto' within our public
  packages. e.g.:

  git grep -l -E 'package org.apache.accumulo.(core.(client|data|security)|minicluster)' . \
      | grep -E '/(impl|crypto|thrift)/' | grep src/main | sed 's%^.*/src/main/java/%%' \
      | sed 's%/[^/]*.java$%%' | sort -u | tr '/' '.'

  This will produce some redundant packages you can trim, e.g.
  org.apache.accumulo.core.client.impl.thrift

-->
<skip_packages>
  org.apache.accumulo.core.clientImpl
  org.apache.accumulo.core.clientImpl.lexicoder
  org.apache.accumulo.core.clientImpl.mapred
  org.apache.accumulo.core.clientImpl.mapreduce
  org.apache.accumulo.core.clientImpl.mapreduce.lib
  org.apache.accumulo.core.dataImpl
  org.apache.accumulo.core.dataImpl.thrift
  org.apache.accumulo.core.securityImpl
  org.apache.accumulo.core.securityImpl.thrift
  org.apache.accumulo.miniclusterImpl
</skip_packages>


<!--
  To update this list, check the README.md file in the apache/accumulo repo under the section title
  'Accumulo API'.
-->
<packages>
  org.apache.accumulo.core.client
  org.apache.accumulo.core.data
  org.apache.accumulo.core.security
  org.apache.accumulo.minicluster
</packages>
