标签: javacompiler

用于远程JAR的Java Annotation处理器

一般问题

我有两个项目A和B; B依赖于A.我想根据A中对象的注释在B中使用Annotation Processor生成一些代码.当我使用正确的Processor实现运行编译时,只会拾取B中带注释的对象.

我知道默认情况下必须禁用扫描其他JAR,因为您通常不希望对所有依赖项执行注释扫描.我也明白,由于编译器魔术可能无法做我想做的事 - 我不太了解 - 但我希望不是.

具体情况

我的项目称为DB和WEB.WEB显然依赖于DB的JPA访问; 这是在Maven中配置的.由于许多架构选择,DB必须保持独立的JAR.除了WEB使用的一些注释之外,DB不使用Spring; WEB使用Spring MVC.

我正在尝试CrudRepository使用Annotation Processor为我的所有JPA实体生成接口.这些@Repository对象应该repo放在WEB项目的包中,因此它们可以@Autowired在我的WEB应用程序中的任何地方使用.我正在执行扫描的注释是@javax.persistence.Entity,但我也尝试了自定义注释,结果相同.

@SupportedAnnotationTypes("javax.persistence.Entity")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class RepositoryFactory extends AbstractProcessor {

    @Override
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
        for (Element e : roundEnv.getElementsAnnotatedWith(Entity.class)) {
            if (e.getKind() != ElementKind.CLASS) {
                continue;
            }
            // TODO: implement logic to skip manually implemented Repos
            try {
                String name = e.getSimpleName().toString();
                TypeElement clazz = (TypeElement) e;

                JavaFileObject f = …
Run Code Online (Sandbox Code Playgroud)

java jpa maven annotation-processing javacompiler

11
推荐指数
2
解决办法
2562
查看次数

解决错误:无法在Android Studio中访问Publisher?

我在编译代码时遇到此错误:

错误日志

谁能帮助我如何解决此错误,或者可能是什么原因导致此错误?

Edit1:项目的Gradle文件。上面的问题也附有错误日志,请检查一下。

import com.google.gms.googleservices.GoogleServicesPlugin

apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

android {

compileSdkVersion 28
buildToolsVersion '28.0.3'
defaultConfig {

    applicationId "com.veblr.videomate"
    minSdkVersion 21
    targetSdkVersion 28
    versionCode 16
    versionName "1.0.0.8"
    testInstrumentationRunner 
"android.support.test.runner.AndroidJUnitRunner"
    multiDexEnabled true
    aaptOptions.cruncherEnabled = true
    aaptOptions.useNewCruncher = false
    vectorDrawables.useSupportLibrary = true
    resConfigs "en"
}

buildTypes {

    debug {
        jniDebuggable true
        multiDexEnabled true
    }
    release {
        minifyEnabled false
        ///shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 
 'proguard-rules.pro'

        //Other parameters
        debuggable false
        jniDebuggable false
        renderscriptDebuggable false
        pseudoLocalesEnabled false
        zipAlignEnabled true

    }
    sourceSets {
        main { …
Run Code Online (Sandbox Code Playgroud)

android android-studio javacompiler

10
推荐指数
1
解决办法
1815
查看次数

JavaCompiler API - 在tomcat中运行时编译速度慢

我的应用程序在运行时生成Java代码,并使用JavaCompiler API对其进行编译.一些生成的文件可能相当大 - 高达几十万行.我发现当我在javac命令行中对生成的代码运行命令时,或者如果我使用通过JavaCompiler API进行编译的应用程序时,我可以编译许多这些文件(~500),即使它们是非常大,不到两分钟.但是,如果我在Tomcat服务器上运行时通过我的应用程序调用API,则编译时间会超过12分钟(!!!).

我将不胜感激任何有关如何提高编译性能的建议.

谢谢!

java tomcat javac java-compiler-api javacompiler

9
推荐指数
1
解决办法
201
查看次数

Java编译器的内部架构

我已经工作Java了8年多.

上周,在我公司的一次小型会议上,我的一位同事问我究竟是如何Java Compiler运作的?我没有回答.

我试图解释,如Java编译器会通过一个语句之一,并将其转换为未针对任何字节码OS,但到JVM.

即使是我也没有人满意这个答案.

现在主要问题是java编译器的工作原理.即,在编译Java文件的情况下,编译器将执行多少步骤或阶段或阶段.

究竟什么Java's compiler建筑?

如果Java classes同一个.java文件中有多个怎么办?然后将编译多少个类.

如果有导入指向未编译的Java类怎么办?然后编译或忽略未编译的类?

我用Google搜索了半天以上,所有人都提供了与我给同事相同的答案.

但最后我在这里找到了一些有用的教程.

但是教程也没有太深入,我无法想象该教程.

我仍然不满意,并渴望从你身上学到更多关于此事的信息.

因此,如果任何人比我和上述博客更了解某些东西,那么通过使用我可以直观地了解内部架构的内容,Java Compiler请解释一下.

java javacompiler

8
推荐指数
2
解决办法
1405
查看次数

找不到根项目参数的方法 sourceCompatibility()

我想为使用 Gradle 构建的Java 库定义目标兼容性。因此,我按照 Java 插件的文档添加了以下块。

apply plugin: 'java'

// ...

compileJava {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}
Run Code Online (Sandbox Code Playgroud)

当我组装项目时,出现以下错误

在根项目中找不到参数 [1.7] 的方法 sourceCompatibility()


有关的

java gradle javacompiler

6
推荐指数
1
解决办法
5353
查看次数

Gradle incremental java编译导致完全重新编译

我只更改了一个源文件并重新启动了构建:

$ gradle jar
Incremental java compilation is an incubating feature.
:compileJava
Full recompilation is required because 'XXX.java' was changed.
Analysis took 0.241 secs.
Run Code Online (Sandbox Code Playgroud)

我的gradle配置有:

compileJava {
  options.fork = true
  options.incremental = true
}
Run Code Online (Sandbox Code Playgroud)

我希望Gradle只重新编译XXX.java,它不是应该做的吗?

gradle javacompiler

6
推荐指数
1
解决办法
2957
查看次数

Kotlin 编译器或 Java 反编译器的奇怪行为

这个问题只是出于我的好奇心,所以我想得到一个完整的答案,而不是简单的“是”或“否”。

让我们考虑这段代码:

// Is stored in util files and used to omit annoying (this as? Smth)?.doSmth()
inline fun <reified T> Any?.cast(): T? {
    return this as? T
}

class PagingOnScrollListener(var onLoadMore: (currentPage: Int, pageSize: Int) -> Unit) : RecyclerView.OnScrollListener() {

    constructor() : this({ _, _ -> Unit })

    private var loading = false
    private var currentPage = 0
    private var latestPageSize = -1

    var visibleThreshold = VISIBLE_THRESHOLD_DEFAULT
    var pageSize = PAGE_SIZE_DEFAULT

    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { …
Run Code Online (Sandbox Code Playgroud)

java decompiler kotlin javacompiler kotlinc

6
推荐指数
1
解决办法
416
查看次数

反正有没有告诉编译器通过注释保留变量名?

让整个应用程序为每个变量名称添加带有变量名称的 @Param() 注释非常烦人。当你更改变量名称并且不得不更改@Param 内部的名称时,这也令人沮丧

有什么好的方法可以注释一个方法,以便编译器知道保留变量名的元信息吗?

我注意到在 eclipse 编译器中,我得到了 arg0、arg1,并且在我逐步执行代码时处于调试模式。如何设置它以便通过实际的变量名称?

最后,我在 Play 1.3 如何处理这个问题上达到了顶峰,它使用了 javassist 和字节码的东西(我更喜欢把它们放在应用程序之外),但仍然不确定它是如何工作的。有谁知道我怎么能那样做(学习比什么都重要)

谢谢,院长

java annotations javacompiler

5
推荐指数
1
解决办法
804
查看次数

Java 11 JavaCompiler 仅在 Linux 上抛出 java.lang.StackOverflowError

Java版本:11.0.13

我有一个在运行时将java文件编译成类的函数,

在 Java 8 上一切正常,在 Windows 上使用 java 11.0.13 一切正常

但在 Linux(Red Hat Enterprise Linux Server 版本 6.10)上,它失败并出现StackOverflowError

代码:

    public Class<?> compile(String className, String content) {
        Lookup lookup = MethodHandles.lookup();
        ClassLoader cl = lookup.lookupClass().getClassLoader();

        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

        try {
            ClassFileManager fileManager = new ClassFileManager(compiler.getStandardFileManager(null, null, null));

            List<CharSequenceJavaFileObject> files = new ArrayList<>();
            files.add(new CharSequenceJavaFileObject(className, content));
            StringWriter out = new StringWriter();

            CompilationTask task = compiler.getTask(out, fileManager, null, compilerOptions, null, files);
            task.call();
            if (fileManager.isEmpty())
                throw new CompilationException("Compilation error: " + …
Run Code Online (Sandbox Code Playgroud)

java java-8 javacompiler java-11

5
推荐指数
0
解决办法
2298
查看次数

Java 编译器是否将循环中的“Set.of”、“List.of”和“Map.of”的临时实例优化为常量

Set给定以下代码片段,其中创建了a 的临时实例,今天的 Java 编译器是否会发现它们不需要为每个循环传递创建实例并优化set为一种最终常量,以便该实例与整个循环?该问题同样适用于whileanddo while循环。

for (/* a loop that iterates quite often */)
{
   var set = Set.of("foo", "blah", "baz");
   // Do something with the set.
}
Run Code Online (Sandbox Code Playgroud)

我还感兴趣是否已经在编译时完成了这样的优化(意味着字节码已经被优化),或者是否存在本质上实现相同效果的运行时优化(由即时编译器进行)。

如果编译器没有看到这一点,唯一的选择似乎是实例化set循环外部以获得最佳效果:

var set = Set.of("foo", "blah", "baz");
for (/* a loop that iterates quite often */)
{
   // Do something with the set.
}
Run Code Online (Sandbox Code Playgroud)

旁注,对于那些发现第一个片段相当糟糕的做法并且无论如何都会像第二个片段一样编写它的人:这个片段实际上是我的真实用例的简化变体,是为了问题的简单性而制作的。让我想到这个问题的真实的、稍微复杂的用例如下,其中需要检查一个字符串是否是极少数字符串之一:

for (/* a loop that iterates quite often */)
{

   // ... …
Run Code Online (Sandbox Code Playgroud)

java optimization javacompiler

5
推荐指数
1
解决办法
185
查看次数