我正在编写一个makefile,它编译一个.java不同目录中的文件,然后我想运行它,而不更改目录.我想做一些事情:
$(SQM_JAVA_TOOL_DONE) : $(SQM_JAVA_TOOL)
$(shell cd /home_dir)
javac myjavafile.java
java myjavafile
Run Code Online (Sandbox Code Playgroud)
Java文件所在的位置/home/myjavafile.java,并且未运行makefile /home.
我怎样才能做到这一点?
我正在尝试在Ubuntu终端上运行javac.但我得到以下内容:
$ javac
The program 'javac' can be found in the following packages:
* openjdk-6-jdk
* ecj
* gcj-4.4-jdk
* gcj-4.6-jdk
* gcj-4.5-jdk
* openjdk-7-jdk
Try: sudo apt-get install <selected package>
Run Code Online (Sandbox Code Playgroud)
jdk已经安装并正在运行sudo apt-get install openjdk-6-jdk说0 upgraded, 0 newly installed, 0 to remove and 322 not upgraded.
我的jdk安装在/ usr/lib/jvm/java-6-open-jdk中; 我能够从eclipse编译并运行一个java程序.但是在使用终端时我遇到了这个前面提到的问题.
我已阅读以前发布的问题.有些是模糊的,没有一个解决我的问题,所以我不得不再问.
我有两个简单的课程,
package One;
import One.Inner.MyFrame;
public class test
{
public static void main(String args[])
{
MyFrame f= new MyFrame();
}
}
Run Code Online (Sandbox Code Playgroud)
而另一类是,
package One.Inner;
import java.awt.*;
import javax.swing.*;
public class MyFrame extends JFrame
{
public MyFrame()
{
setPreferredSize(new Dimension(400,560));
setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
我在Windows cmd中的基本文件夹"基本".我编译使用
basic> javac *.java -d .
Run Code Online (Sandbox Code Playgroud)
创建文件夹和子文件夹.
cd One
basic\One> java test
Run Code Online (Sandbox Code Playgroud)
这会产生一大堆错误.许多答案旨在指定不起作用的完整路径.我的类在One中,因此指定一个使用-cp也不起作用.
我保存了我的Java源文件,将其编码类型指定为UTF-8(使用记事本,默认情况下,记事本的编码类型为ANSI),然后我尝试使用以下命令编译它:
javac -encoding "UTF-8" One.java
Run Code Online (Sandbox Code Playgroud)
但它给出了一条错误消息"
One.java:1: illegal character: \65279
?public class One {
^
1 error
Run Code Online (Sandbox Code Playgroud)
还有其他方法,我可以编译吗?
这是来源:
public class One {
public static void main( String[] args ){
System.out.println("HI");
}
}
Run Code Online (Sandbox Code Playgroud) 我有编写的ant脚本:
<javac srcdir="${test.src.dir}" destdir="${test.dist.dir}">
...
<compilerarg value="-Xlint:unchecked" />
</javac>
Run Code Online (Sandbox Code Playgroud)
我需要增加编译器的堆内存,所以我将以下参数放入compileargs:
<compilerarg value="-Xlint:unchecked -Xms128m -Xmx512m" />
Run Code Online (Sandbox Code Playgroud)
但我在控制台中收到错误:
[javac] javac: invalid flag: -Xms128m
[javac] Usage: javac <options> <source files>
Run Code Online (Sandbox Code Playgroud)
为什么会这样?如何增加使用的内存javac?
javac 有一个有趣的-O选择:
通过内联静态,最终和私有方法来优化编译代码.请注意,您的课程可能会变得更大.
这个选项似乎不受欢迎(隐藏?),我今天刚刚在CodeCup 2014页面上发现它.
-O中未提及的官方文件,也不在man javac......奇怪.
在对类似问题的接受答案中,我们可以读到:
Java中的优化主要由JIT编译器在运行时完成.因此,没有必要尝试指示它在编译时优化某种方式(无论如何它只创建字节码).JIT几乎肯定会在现场做出更好的决策,了解确切的环境并观察代码特定部分的实际执行模式.
我的问题是:
我应该总是使用该-O选项吗?换句话说,代码总是运行得更快-O或根本没有差别?
也许班级规模会增加太多,整体表现会下降?或者JVM无论如何都会进行内联,所以最好留下它?
类似的故事是与gcc -O3国旗.
说实话,我对所有这些术语都非常困惑(JDK/JRE/Java SDK).我不确定每个人做了什么.
当我第一次在eclipse中开始做简单的java示例时,我很确定我只有JRE,我认为这是普通用户能够在其系统上运行java程序/ applet的默认java安装程序.
但是,现在在课堂上我们正在使用Google Appengine,这需要我猜的JDK与Java SDK相同.在浪费一些时间发现安装JDK意味着我还必须将java/bin添加到环境变量以使javac -version在命令提示符下工作我发现只有JDK有javac ...
我的早期java程序如何在没有安装JDK的情况下工作,因此没有javac?而且真正的主要问题是...... JRE和JDK之间有什么区别,你什么时候使用它们?
谢谢 :)
我想知道JVM/javac是否足够聪明
// This line...
string a = foo();
string foo()
{
return bar();
}
string bar()
{
return some-complicated-string computation;
}
Run Code Online (Sandbox Code Playgroud)
成
string a = bar();
Run Code Online (Sandbox Code Playgroud)
或者在发布案例中删除对foo()的不必要调用(因为无法访问的代码):
string a = foo(bar());
// bar is the same
...
string foo(string b)
{
if (debug) do-something-with(b);
}
Run Code Online (Sandbox Code Playgroud)
对于第一个例子我的感觉是肯定的,对于第二个例子我的感觉是"不太确定",但是有人可以给我一些指示/链接来确认吗?
我的文件夹中有四个java文件.它们都在同一个包装中.这是包装声明
package com.osama.GHide
所有这些类都在同一个包中.我想知道如何使用它编译它们javac(我的意思是我不知道如何编译彼此使用的多个文件).一旦完成,我如何java在CLI中使用命令启动?这是文件名.
EnteringPoint.java
HidingProcess.java
ListFiles.java
time javac Main.java --> 0m1.050s
time javac Main.java & javac Main.java --> 0m1.808s
time javac Main.java & javac Main.java & javac Main.java --> 0m2.690s
time javac Main.java & ... 8 time --> 0m8.309s
Run Code Online (Sandbox Code Playgroud)
当我们javac并行运行命令并且每次增加javac命令时~1 sec都会添加所有javac命令来完成.
为什么线性增长是时间?
是javac运行过程中的所有过程都涉及某种类型locks,如果是,如何克服它以便不会在时间上有线性增长
PS:上面我已经试过上single core machine,double core machine,4 core machine都表现出相同的行为.
PS2:环境RedHat7,javac 1.7.0_79