相关疑难解决方法(0)

javac和Eclipse编译器有什么区别?

Eclipse的Java编译器只是程序所在的同一个核心的包装器javac,还是一个单独的编译器?如果是后者,为什么他们会重新发明轮子?

java eclipse javac

192
推荐指数
4
解决办法
6万
查看次数

通过另一个包的公共子类使用包私有类的公共方法引用时出现IllegalAccessError

昨天我在Tomcat 8上部署我的Java 8 webapp后遇到了一个有趣的问题.我不想如何解决这个问题,而是更了解为什么会发生这种情况.但是,让我们从头开始.

我有两个类定义如下:

Foo.java

package package1;

abstract class Foo {

    public String getFoo() {
        return "foo";
    }

}
Run Code Online (Sandbox Code Playgroud)

Bar.java

package package1;

public class Bar extends Foo {

    public String getBar() {
        return "bar";
    }

}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它们在同一个包中,并最终在同一个jar中,我们称之为commons.jar.这个jar是我的webapp的依赖(即在我的webapp的pom.xml中被定义为依赖).

在我的webapp中,有一段代码可以:

package package2;

public class Something {

    ...

    Bar[] sortedBars = bars.stream()
                           .sorted(Comparator.comparing(Bar::getBar)
                                             .thenComparing(Bar::getFoo))
                           .toArray(Bar[]::new);

    ...

}
Run Code Online (Sandbox Code Playgroud)

当它被执行时,我得到:

java.lang.IllegalAccessError: tried to access class package1.Foo from class package2.Something
Run Code Online (Sandbox Code Playgroud)

玩耍和试验我能够通过三种方式避免错误:

  1. 将Foo类更改为public而不是package-private;

  2. 将Something类的包更改为"package1"(即字面上与Foo和Bar类相同,但物理上不同的是webapp中定义的Something类);

  3. 在执行违规代码之前强制加载Foo:

    try {
        Class<?> fooClass = Class.forName("package1.Foo");
    } …
    Run Code Online (Sandbox Code Playgroud)

java maven-3 maven java-8 maven-compiler-plugin

21
推荐指数
2
解决办法
3687
查看次数

如何从Eclipse运行Javac

我正在尝试在Eclipse中编译的.class文件上运行'javac'工具.我打开外部工具配置他们填充filds:

位置: C:\ Program Files\Java\jdk1.6.0_25\bin\javac.exe

工作目录: $ {workspace_loc:/ Main/bin}

争论:

我想问你在Arguments字段中必须写什么,我填写*Location*和Working directory: fields对吗?

java eclipse android javac

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

标签 统计

java ×3

eclipse ×2

javac ×2

android ×1

java-8 ×1

maven ×1

maven-3 ×1

maven-compiler-plugin ×1