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


Generated Class Names
~~~~~~~~~~~~~~~~~~~~~

By default, classes are named after the table they represent. e.g.,
+sqoop --table foo+ will generate a file named +foo.java+. You can
override the generated class name with the +--class-name+ argument.

----
$ sqoop --connect jdbc:mysql://database.example.com/employees \
  --table employee_names --class-name com.example.EmployeeNames
----
_This generates a file named +com/example/EmployeeNames.java+_

If you want to specify a package name for generated classes, but
still want them to be named after the table they represent, you
can instead use the argument +--package-name+:

----
$ sqoop --connect jdbc:mysql://database.example.com/employees \
  --table employee_names --package-name com.example
----
_This generates a file named +com/example/employee_names.java+_


