


Class _ResourceReference_ allows to specify the resources it depends on overriding method _getDependencies()_. The method returns a list of _HeaderItem_s that must be rendered before the resource referenced by _ResourceReference_ can be used. This can be really helpful when our resources are JavaScript or CSS libraries that in turn depend on other libraries.

For example we can use this method to ensure that a custom reference to JQueryUI library will find JQuery already loaded in the page: 

[source,java]
----
Url jqueyuiUrl = Url.parse("https://ajax.googleapis.com/ajax/libs/jqueryui/" + 
                                                                 "1.10.2/jquery-ui.min.js");
		
UrlResourceReference jqueryuiRef = new UrlResourceReference(jqueyuiUrl){
	@Override
	public List<HeaderItem> getDependencies() {
		Application application = Application.get();
		ResourceReference jqueryRef = application.getJavaScriptLibrarySettings(). 
                                             getJQueryReference();
				
		return Arrays.asList(JavaScriptHeaderItem.forReference(jqueryRef));
	}
};
----

Please note that in the code above we have built a resource reference using a URL to the desired library instead of a package resource holding the physical file.

NOTE: Wicket already provides base class _org.apache.wicket.resource.JQueryPluginResourceReference_ for those JavaScript resources that depend on JQuery. This class uses the JQuery version bundled with Wicket.

NOTE: The same method _getDependencies()_ is defined also for class _HeaderItem_.

