Что должен делать флаг --precompile?
Я использую Spoon для генерации кода на аннотированных классах, чтобы уменьшить количество повторений кода и кода в проекте, над которым я работаю.
Поскольку проект довольно маленький, я искал пути, поэтому мне не нужно разбивать все это на два или даже три разных проекта, которые должны быть скомпилированы для того, чтобы мой AnnotationProcessor был доступен в
Глядя на документацию Spoon, я нашел --precompile
флаг, который, как я понимаю, должен предварительно скомпилировать весь исходный код и добавить его в путь к классам, чтобы Spoon нашел процессор и другие вещи во время выполнения.
Но в соответствии с ошибками, которые я получаю при запуске, он, похоже, не работает, и мне все еще не хватает процессора, хотя я добавил эту опцию.
[INFO] --- exec-maven-plugin:1.5.0:java (execute-spoon) @ JHTML5 ---
12:29:50.454 [spoon.Launcher.main()] DEBUG spoon.support.StandardEnvironment - output: spooned
12:29:50.456 [spoon.Launcher.main()] DEBUG spoon.support.StandardEnvironment - destination: C:\Data\CrumbleWorks_java\JHTML5\spooned-classes
12:29:50.457 [spoon.Launcher.main()] DEBUG spoon.support.StandardEnvironment - source classpath: null
12:29:50.457 [spoon.Launcher.main()] DEBUG spoon.support.StandardEnvironment - template classpath: []
12:29:50.466 [spoon.Launcher.main()] DEBUG spoon.support.StandardEnvironment - output: spooned
12:29:50.466 [spoon.Launcher.main()] DEBUG spoon.support.StandardEnvironment - destination: C:\Data\CrumbleWorks_java\JHTML5\spooned-classes
12:29:50.466 [spoon.Launcher.main()] DEBUG spoon.support.StandardEnvironment - source classpath: null
12:29:50.467 [spoon.Launcher.main()] DEBUG spoon.support.StandardEnvironment - template classpath: []
12:29:50.467 [spoon.Launcher.main()] DEBUG spoon.support.StandardEnvironment - compiling sources: []
12:29:50.539 [spoon.Launcher.main()] DEBUG spoon.support.StandardEnvironment - compile args: [-encoding, UTF-8, -cp, .;/C:/Data/CrumbleWorks_java/JHTML5/target/classes;/C:/Data/Maven/repo/fr/inria/gforge/spoon/spoon-core/5.4.0/spoon-core-5.4.0.jar;/C:/Data/Maven/repo/org/eclipse/jdt/org.eclipse.jdt.core/3.12.0.v20160516-2131/org.eclipse.jdt.core-3.12.0.v20160516-2131.jar;/C:/Data/Maven/repo/com/martiansoftware/jsap/2.1/jsap-2.1.jar;/C:/Data/Maven/repo/commons-io/commons-io/1.4/commons-io-1.4.jar;/C:/Data/Maven/repo/org/slf4j/log4j-over-slf4j/1.7.21/log4j-over-slf4j-1.7.21.jar;/C:/Data/Maven/repo/ch/qos/logback/logback-classic/1.1.7/logback-classic-1.1.7.jar;/C:/Data/Maven/repo/ch/qos/logback/logback-core/1.1.7/logback-core-1.1.7.jar;/C:/Data/Maven/repo/org/crumbleworks/forge/crumbutil/crumbutil/0.1.0/crumbutil-0.1.0.jar;/C:/Data/Maven/repo/org/slf4j/slf4j-api/1.7.21/slf4j-api-1.7.21.jar, -d, C:\Data\CrumbleWorks_java\JHTML5\spooned-classes, -1.8, -proc:none, -preserveAllLocals, -noExit, -enableJavadoc, .]
12:29:50.790 [spoon.Launcher.main()] DEBUG spoon.support.StandardEnvironment - compiled in 323 ms
12:29:50.792 [spoon.Launcher.main()] INFO spoon.support.StandardEnvironment - Spoon version 5.4.0
12:29:50.792 [spoon.Launcher.main()] INFO spoon.support.StandardEnvironment - running Spoon...
12:29:50.792 [spoon.Launcher.main()] INFO spoon.support.StandardEnvironment - start processing...
12:29:50.792 [spoon.Launcher.main()] DEBUG spoon.support.StandardEnvironment - building sources: []
12:29:50.792 [spoon.Launcher.main()] DEBUG spoon.support.StandardEnvironment - built in 0 ms
12:29:50.792 [spoon.Launcher.main()] DEBUG spoon.support.StandardEnvironment - building templates: []
12:29:50.792 [spoon.Launcher.main()] DEBUG spoon.support.StandardEnvironment - built in 0 ms
12:29:50.793 [spoon.Launcher.main()] DEBUG spoon.support.StandardEnvironment - model built in 1
[WARNING]
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:294)
at java.lang.Thread.run(Thread.java:745)
Caused by: spoon.SpoonException: Unable to load processor "org.crumbleworks.forge.jhtml5.spoon.AttributeProcessor" - Check your classpath. Did you use the --precompile option?
at spoon.support.QueueProcessingManager.addProcessor(QueueProcessingManager.java:79)
at spoon.support.compiler.jdt.JDTBasedSpoonCompiler.instantiateAndProcess(JDTBasedSpoonCompiler.java:169)
at spoon.Launcher.process(Launcher.java:719)
at spoon.Launcher.run(Launcher.java:665)
at spoon.Launcher.run(Launcher.java:106)
at spoon.Launcher.main(Launcher.java:99)
... 6 more
Caused by: java.lang.ClassNotFoundException: org.crumbleworks.forge.jhtml5.spoon.AttributeProcessor
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at spoon.support.QueueProcessingManager.addProcessor(QueueProcessingManager.java:77)
... 11 more
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.202 s
[INFO] Finished at: 2016-10-31T12:29:50+01:00
[INFO] Final Memory: 14M/284M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.5.0:java (execute-spoon) on project JHTML5: An exception occured while executing the Java class. null: InvocationTargetException: Unable to load processor "org.crumbleworks.forge.jhtml5.spoon.AttributeProcessor" - Check your classpath. Did you use the --precompile option? -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
Полный вывод ошибок maven
Увы, эта линия меня смущает...
Caused by: spoon.SpoonException: Unable to load processor "org.crumbleworks.forge.jhtml5.spoon.AttributeProcessor" - Check your classpath. Did you use the --precompile option?
... потому что да, я использовал опцию --precompile. Спасибо за вопрос
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>${exec-plugin.version}</version>
<executions>
<execution>
<id>execute-spoon</id>
<phase>process-sources</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<classpathScope>compile</classpathScope>
<mainClass>spoon.Launcher</mainClass>
<arguments>
<argument>--with-imports</argument>
<argument>--processors</argument>
<argument>org.crumbleworks.forge.jhtml5.spoon.AttributeProcessor</argument>
<argument>--enable-comments</argument>
<argument>--precompile</argument>
</arguments>
</configuration>
</execution>
</executions>
</plugin>
Объявление плагина Maven для запуска ложки с помощью exec-maven-plugin (который выполняет любой исполняемый файл Java)
Итак: что должен делать флаг --precompile?
Соответственно что я делаю не так?
редактировать:
Вот упрощенный пример с maven-pom и файлом readme, описывающим, как запускать и показывать без использования maven: https://github.com/CrumbleWorks/Spoon-Precompile-Issue
1 ответ
--precompile
опция компилирует исходный код, указанный в качестве входных данных, так что для всех CtTypeReference
объекты, фактический класс может быть получен с getActualClass()
, Кроме того, это также позволяет getActualClass()
для любого CtType
,
(это позволяет смешивать отражение Spoon с отражением Java в том же анализе или преобразовании)