問題描述:java
項目開始啓動的時候,沒問題。工具
修改代碼後jetty啓動報錯,說是ActionKey已經存在了,檢查後發現,RouteBind類的config()中。debug
List<Class<? extends Controller>> controllerClasses = ClassSearchKit.of(Controller.class) .includepaths(includeClassPaths).search();
問題出在這段代碼。code
debug進去WebAppClassLoader類中的getResources()方法裏面。發現。rem
classes路徑保存了兩個同樣的,致使後面掃描的時候,class文件保存了兩份。
get
進入ClassSearchKit 類裏面查看search()方法it
return extraction(target, classFileList);
這個方法返回了最終的classFileList。io
啓動時:class
修改代碼重啓時:List
classFileList中每一個controller都重複了。
因此,寫一個工具類,將生成的list中,重複的Controller去掉就能夠了。
public class CollectionKit { public static List<Class<? extends Controller>> removeDuplicate(List<Class<? extends Controller>> list){ HashSet<Class<? extends Controller>> h = new HashSet<Class<? extends Controller>>(list); list.clear(); list.addAll(h); return list; } }
以後RouteBind類的config()方法掉調用一下就能夠了。
public void config() { List<Class<? extends Controller>> controllerClasses = ClassSearchKit .of(Controller.class).includepaths(includeClassPaths).search(); controllerClasses=CollectionKit.removeDuplicate(controllerClasses); ControllerKey controllerKey = null; …… ……
問題解決。