It already required that... previously this 
```
init(hardware_interface::EffortJointInterface *robot, ros::NodeHandle &n)
```
function called the first
```
init(hardware_interface::EffortJointInterface *robot, const std::string &joint_name, const control_toolbox::Pid &pid)
```
function, which then required a URDF be used.

I agree it would be nice to have a little more control over the param location, although you have some based on your NodeHandle's namespace. But this is a *ros_controller*, so I don't think we should spend too much time removing URDF dependencies.