在大多数现代IDE中,您可以设置一个参数,以确保javac获得足够的堆内存来进行编译.由于不值得进入的原因,我们暂时与JBuilder 2005/2006并列,看起来源代码的数量超过了javac可以处理的数量.
请保留JBuilder 2005/2006 javac的具体答案(我们现在无法迁移,Borland Make编译器不能正确支持Java 1.6)
我知道如何和什么参数应该传递给javac的,问题是IDE似乎并没有让这些在任何地方设置.很多配置都隐藏在Jbuilder Install\bin*.config文件中,我觉得答案可能在某处,但还没有找到.
我正在为我的雇主做一个自动化项目.我们的源代码的每个版本都有一个池.下载修订时,需要创建一个包含一堆第三方包含的目录结构,以最终构建项目.我已经将整个过程自动化,直到让我的脚本(.bat)编译每个特定的可运行java应用程序.这个单一项目有很多应用程序,目录列表如下所示:
Proj Name
-variousincludesfolder1
-variousincludesfolder2
-variousincludesfolder3
-variousincludesfolder4
-runnableapplicationsandmoreincludes
-con.java
Run Code Online (Sandbox Code Playgroud)
现在,我想对con.java进行自动编译,但我不知道从哪里开始.人们建议我尝试使用Ant,但是我使用Eclipse生成的任何自动化Ant文件似乎都足以在存在活动项目文件时构建con.java.反正有没有使用eclipse自动执行此操作,以至于让批处理文件生成.jar本身?
调用此方法:
public static @Nonnull <TV, TG extends TV> Maybe<TV> something(final @Nonnull TG value) {
return new Maybe<TV>(value);
}
Run Code Online (Sandbox Code Playgroud)
像这样:
public @Nonnull Maybe<Foo> visit() {
return Maybe.something(new BarExtendsFoo());
}
Run Code Online (Sandbox Code Playgroud)
在Eclipse中编译得很好,但是javac给出了一个"不兼容的类型"警告:
found : BarExtendsFoo
Run Code Online (Sandbox Code Playgroud)
要求:Foo
我用两个文件制作了一个非常简单的java示例:
Dog.java包含:
package com.greg.dog;
public class Dog {
public void bark() {
System.out.println("bark");
}
}
Run Code Online (Sandbox Code Playgroud)
TestDog.java包含:
package com.greg.dog;
public class TestDog {
public static void main(String args[]) {
Dog d = new Dog();
d.bark();
}
}
Run Code Online (Sandbox Code Playgroud)
我在位置〜/ Desktop/test/src/com/greg/dog中有这两个文件
当我编译它们时,Dog.java编译得很好,但是TestDog.java找不到我的Dog类:
user1@blackpearl:~/Desktop/test/src/com/greg/dog$ javac Dog.java
user1@blackpearl:~/Desktop/test/src/com/greg/dog$ javac TestDog.java
TestDog.java:6: cannot find symbol
symbol : class Dog
location: class com.greg.dog.TestDog
Dog d = new Dog();
^
TestDog.java:6: cannot find symbol
symbol : class Dog
location: class com.greg.dog.TestDog
Dog d = new Dog();
^
2 …Run Code Online (Sandbox Code Playgroud) 我被告知它javac足够聪明,它不会重新编译.java,因为它.java有一个时间戳之前的时间戳.class.我发现它在我的机器中不能像那样工作,我在某处肯定是错的吗?
我P.java位于.../eg/access,P.java声明为一个访问包
eg
|- access
|- P.class
|- P.java
Run Code Online (Sandbox Code Playgroud)
然后,当我运行时javac P.java,每次重新编译,是正常还是我错了?
这是我第一次使用外部库,我对删除所有错误感到有些紧张.添加库时,我会使用相同的修复程序"删除@Override注释"给出一大堆错误.
解决此问题的方法是将JDK增加到1.6:ActionBarSherlock库在导入后会出现错误
但现在我担心我的其他应用程序......我是否以错误的方式编译它们?另外,我有1.7的JDK可用,我应该使用它而不是1.6吗?对不起,我真的不知道区别.
实际上,这个问题有点宽泛.我知道javac将java文件编译成字节码,一个类文件.因此,类文件应该包含jvm指令和所有这些.另一方面,查看这些指令的唯一方法是使用javap -c反编译类文件.但它不是反编译,对吧?因为如果它是反编译,它会产生java文件.所以,我的猜测是javac编译java文件2次(实际上并不是真的,但为了简单起见,我们假设),首先是jvm指令,然后是字节码,所以javap -c从字节码反编译为jvm指令.Jvm应该理解字节码,因此它无法理解指令.我在这里有点困惑.有人能解释一下这里发生了什么吗?
编译jsp文件时出现以下错误:
源级别低于1.7的"<>"运算符不允许
我正在使用jdk 1.7.x和eclipse Kepler我1.7 as compliance level也在Eclipse中设置了项目首选项,但代码仍无效
我应该添加任何其他配置吗?
很明显,这段代码在迭代期间修改了一个列表.
public class ArrayIterator {
public static void main(String[] args) {
List<String> list = new LinkedList<>(Arrays.asList("A","B","C","D","E"));
Iterator<String> it = list.iterator();
while (it.hasNext())
{
list.remove(it.next());
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以我们得到了预期的例外
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:966)
at java.util.LinkedList$ListItr.next(LinkedList.java:888)
at ArrayIterator.main(ArrayIterator.java:15)
Run Code Online (Sandbox Code Playgroud)
为什么编译器不能对此发出警告?
在编译a时Client,它使用一些接口I(例如O)的实现,类文件I也必须存在于类路径中.奇怪的是,这只是一个例子javac,因为Eclipse编译器(ECJ)不需要I编译.
是什么让JDK 需要超类型进行编译,ECJ编译得很好?
它不是默认方法,如错误报告中所评论的那样,兼容性指南也同意:
在针对另一个实现在另一个类文件中定义的接口的类编译类时,这样的类文件(其中定义了接口)必须在编译期间由javac使用的类路径中可用.这是JDK 8的新要求 - 如果不这样做将导致编译错误.
更新:
I.doit()是default简单的抽象方法都没关系,行为是一样的I.doit()被覆盖,当然都很重要O; 如果没有覆盖,那么ECJ也会达到I定义doit()接口(api/a/I.java):
package a;
public interface I {
default void doit() {
System.out.println("In I");
}
}
Run Code Online (Sandbox Code Playgroud)
实施(impl/b/O.java):
package b;
public class O implements a.I {
public void doit() {
System.out.println("In O"); …Run Code Online (Sandbox Code Playgroud)