【发布时间】:2016-11-11 11:34:39
【问题描述】:
考虑一个场景,我得到了一个我一无所知的 Java 项目,我必须编译并运行它。
我想要一些解决方案,让我能够编译和运行任何程序尽可能快地不了解项目。
我尝试了什么:
为此,我使用以下过程来编译程序。
# compile *.java files into *.class files
javac -d . -encoding UTF-8 *.java
要运行我正在使用以下命令的程序,但它需要 package 和 class 方法 main 所在的位置。我不知道。
java -Dfile.encoding=utf-8 package.class
我发现可以使用循环和javap来检查它,所以我写了一个简单的shell脚本来自动编译程序,找到main方法所在的包和类并运行它:
containsMain()
{
if javap -public $1 | fgrep 'public static void main(' > /dev/null; then
echo $1 | sed 's/^.\///' | cut -f 1 -d '.' | tr / .
fi
}
for classfile in */*.class; do
runclass=$(containsMain $classfile);
if [ "$runclass" ]; then
break
fi
done
java -Dfile.encoding=utf-8 $runclass
我发现了什么问题:
这按预期工作,但 javap 是 慢 地狱。 检查每个文件需要 1.2 秒。因此,在最坏的情况下,它必须遍历所有文件才能找到 main 方法,这可能需要很长时间。
另一种解决方案?
我正在考虑编写一些正则表达式来在 *.java 文件中搜索方法 main 并解析其所在的类和包。这并不像看起来那么容易,因为 main 方法可以用多种方式编写(修饰符)。它可以写成cmets、字符串等。甚至可以有文件中有多个类。
但如果这是一个正确的解决方案,我有点害怕,我想知道在我开始做这样的事情之前没有其他方法。
感谢您的建议:)
【问题讨论】:
标签: java linux performance compilation debian