Title: The Apache(tm) XML Graphics Project - Mailing Lists

#The Apache&trade; XML Graphics Project - Mailing Lists

## Mailing Lists

Every volunteer project obtains its strength from the people involved in it. Mailing lists provide a simple and effective communication mechanism.

You are welcome to join any of these mailing lists (or all of them if you wish). You can choose to lurk, or actively participate. It's up to you. Before you join these lists, you should look over the resources in the Reference Library section. As with any mailing list, you should probably read any FAQ postings or simply read a sampling of postings on the list before posting your first question.

## Usage Notes { #usage}

Archives are generally named after the project they're about (duh!) with a suffix that denotes the subjects covered. Common suffixes are:


-  `*-dev` Developer list - for technical questions about the product, code patches, bug submissions about advanced functionality, etc.

-  `*-users` Users list - for general usage questions about the product from an end-users perspective

-  `*-commits` commit list - this is a read-only list that sends out email with details of all changes to that project's Git or Wiki repository

The ezmlm mailing list controller accepts commands by sending emails to `<listname>-command`, generally like the following:


-  `*-subscribe` Subscribe your current email address to the list

-  `*-unsubscribe` UnSubscribe your **current** email address from the list

-  `*-help` get Help on mailing list commands
If you want to unsubscribe from the XML Graphics General mailing list you send an empty mail to `general-unsubscribe@xmlgraphics.apache.org`.
# Public Archives { #public_archives}

Archives of all public mailing lists can be found here:


-  [http://mail-archives.apache.org/mod_mbox/](http://mail-archives.apache.org/mod_mbox/) (mod_mbox archives)

- Some lists are also available from [The Mail Archive](http://www.mail-archive.com/), [GMANE](http://www.gmane.com/) and [MarkMail](http://xmlgraphics.markmail.org/).

## XML Graphics General Mailing List { #xmlgraphics-general}

 *Low Traffic*  [Subscribe](mailto:general-subscribe@xmlgraphics.apache.org)  [Unsubscribe](mailto:general-unsubscribe@xmlgraphics.apache.org)

This list is for issues that span across all xmlgraphics.apache.org projects, whether technical or organizational. Discussions about specific code bases should be redirected to one of the codebase-specific lists below, except for XML Graphics Commons which is discussed here.

 **Archives:**


-  [http://mail-archives.apache.org/mod_mbox/xmlgraphics-general/](http://mail-archives.apache.org/mod_mbox/xmlgraphics-general/) (mod_mbox archives)


## XML Graphics Commits Mailing List { #xmlgraphics-commits}

 *Low Traffic*  [Subscribe](mailto:commits-subscribe@xmlgraphics.apache.org)  [Unsubscribe](mailto:commits-unsubscribe@xmlgraphics.apache.org)

This is a read-only list that sends out email with details of all commits to the Apache XML Graphics Commons subproject, the Apache XML Graphics project website repository and to its Wiki.

 **Archives:**


-  [http://mail-archives.apache.org/mod_mbox/xmlgraphics-commits/](http://mail-archives.apache.org/mod_mbox/xmlgraphics-commits/) (mod_mbox archives)


## Batik Users Mailing List { #batik-users}

 *Medium Traffic*  [Subscribe](mailto:batik-users-subscribe@xmlgraphics.apache.org)  [Unsubscribe](mailto:batik-users-unsubscribe@xmlgraphics.apache.org)

This is the list for active users of the Batik project, where issues regarding installation and use of Batik are discussed. Also code changes and new releases are announced on this list.

 **Archives:**


-  [http://mail-archives.apache.org/mod_mbox/xmlgraphics-batik-users/](http://mail-archives.apache.org/mod_mbox/xmlgraphics-batik-users/) (mod_mbox archives)


## Batik Developers Mailing List { #batik-dev}

 *Medium Traffic*  [Subscribe](mailto:batik-dev-subscribe@xmlgraphics.apache.org)  [Unsubscribe](mailto:batik-dev-unsubscribe@xmlgraphics.apache.org)

This is the list for everyone interested and involved with the active development of Batik.

 **Archives:**


-  [http://mail-archives.apache.org/mod_mbox/xmlgraphics-batik-dev/](http://mail-archives.apache.org/mod_mbox/xmlgraphics-batik-dev/) (mod_mbox archives)


## Batik Commits Mailing List { #batik-commits}

 *Medium Traffic*  [Subscribe](mailto:batik-commits-subscribe@xmlgraphics.apache.org)  [Unsubscribe](mailto:batik-commits-unsubscribe@xmlgraphics.apache.org)

This is a read-only list that sends out email with details of all commits to the Apache Batik subproject code repository and to its Wiki.

 **Archives:**


-  [http://mail-archives.apache.org/mod_mbox/xmlgraphics-batik-commits/](http://mail-archives.apache.org/mod_mbox/xmlgraphics-batik-commits/) (mod_mbox archives)


## FOP Users Mailing List { #fop-users}

 *Medium Traffic*  [Subscribe](mailto:fop-users-subscribe@xmlgraphics.apache.org)  [Unsubscribe](mailto:fop-users-unsubscribe@xmlgraphics.apache.org)

This is the list for active users of the FOP project, where issues regarding installation and use of FOP are discussed. Also code changes and new releases are announced on this list.

 **Archives:**


-  [http://mail-archives.apache.org/mod_mbox/xmlgraphics-fop-users/](http://mail-archives.apache.org/mod_mbox/xmlgraphics-fop-users/) (mod_mbox archives)

It is usually a good idea to state the FOP & JDK/JRE version and the operating system you are using. Also, if you are attaching large binary files (PDF, JPG, etc.), please consider attaching a minimal, appropriate B&W GIF, JPG or PNG that conveys the necessary information instead. A good alternative is to put the files on a web server.
# FOP Developers Mailing List { #fop-dev}

 *Medium Traffic*  [Subscribe](mailto:fop-dev-subscribe@xmlgraphics.apache.org)  [Unsubscribe](mailto:fop-dev-unsubscribe@xmlgraphics.apache.org)

This is the list for everyone interested and involved with the active development of FOP.

 **Archives:**


-  [http://mail-archives.apache.org/mod_mbox/xmlgraphics-fop-dev/](http://mail-archives.apache.org/mod_mbox/xmlgraphics-fop-dev/) (mod_mbox archives)


## FOP Commits Mailing List { #fop-commits}

 *Medium Traffic*  [Subscribe](mailto:fop-commits-subscribe@xmlgraphics.apache.org)  [Unsubscribe](mailto:fop-commits-unsubscribe@xmlgraphics.apache.org)

This is a read-only list that sends out email with details of all commits to the Apache FOP subproject code repository and to its Wiki.

 **Archives:**


-  [http://mail-archives.apache.org/mod_mbox/xmlgraphics-fop-commits/](http://mail-archives.apache.org/mod_mbox/xmlgraphics-fop-commits/) (mod_mbox archives)
