Да, это вполне возможно, если вы правильно реализовать ForwardingJavaFileManager
. Два наиболее важных метода: inferBinaryName() и list(). Если вы установите их правильно, компилятор сможет разрешить классы, которые вы предварительно скомпилировали.
inferBinaryName()
должен возвращать класс simple name (например, выведенный бинарное название com.test.Test
будет просто Test
). Вот моя реализация (мой подкласс JavaFileObject
называется InAppJavaFileObject
):
@Override
public String inferBinaryName(Location location, JavaFileObject javaFileObject) {
if(location == StandardLocation.CLASS_PATH && javaFileObject instanceof InAppJavaFileObject) {
return StringUtils.substringBeforeLast(javaFileObject.getName(), ".java");
}
return super.inferBinaryName(location, javaFileObject);
}
Обратите внимание, что я вырезают «.java» с конца. При построении JavaFileObject
имя файла должно заканчиваться на «.java», но если вы не разделите суффикс позже, компилятор не найдет ваш класс.
list()
немного сложнее, потому что вы должны быть осторожны, чтобы хорошо играть с вашим файловым менеджером делегата. В моей реализации, я держу карту полного имени класса к моему подклассу JavaFileObject
, что я могу итерации по:
@Override
public Iterable<JavaFileObject> list(Location action, String pkg, Set<JavaFileObject.Kind> kind, boolean recurse) throws IOException {
Iterable<JavaFileObject> superFiles = super.list(action, pkg, kind, recurse);
// see if there's anything in our cache that matches the criteria.
if(action == StandardLocation.CLASS_PATH && (kind.contains(JavaFileObject.Kind.CLASS) || kind.contains(JavaFileObject.Kind.SOURCE))) {
List<JavaFileObject> ourFiles = new ArrayList<JavaFileObject>();
for(Map.Entry<String,InAppJavaFileObject> entry : files.entrySet()) {
String className = entry.getKey();
if(className.startsWith(pkg) && ("".equals(pkg) || pkg.equals(className.substring(0, className.lastIndexOf('.'))))) {
ourFiles.add(entry.getValue());
}
}
if(ourFiles.size() > 0) {
for(JavaFileObject javaFileObject : superFiles) {
ourFiles.add(javaFileObject);
}
return ourFiles;
}
}
// nothing found in our hash map that matches the criteria... return
// whatever super came up with.
return superFiles;
}
После того, как у вас есть эти методы должным образом реализованы, остальные просто работает. Наслаждайтесь!
Извините, если я медленный, но я не вижу, как ссылка, которую вы опубликовали, решает проблему. я сам столкнулся с той же проблемой ... мой API выходит намного чище и легко управляется, если я могу скомпилировать классы по отдельности. я был бы признателен за тонну, если бы вы могли опубликовать решение в качестве ответа. :) – stevevls 2011-12-06 14:08:59
На самом деле, я только что получил это, поэтому я отправил ответ ради потомков. спасибо за большой вопрос! – stevevls 2011-12-07 13:07:50