2013-03-12 49 views
0

我能够在Eclipse中没有任何问题的情况下编译我的Main.java文件。如何使用一个包在linux中编译java文件

里面Main.java我

package com.selenium.zLoadProfilerPkg; 

其他3个文件里面我也有

package com.selenium.zLoadProfilerPkg; 

但是当我上传的整体结构到Linux,我尝试编译它,我得到错误:

[[email protected] zLoadProfilerPkg]$ pwd 
/home/sgalkov/zpp_tech_git_checkout/profiler/zLoadProfiler/zLoadProfiler/src/com/selenium/zLoadProfilerPkg 
[[email protected] zLoadProfilerPkg]$ cd /home/sgalkov/zpp_tech_git_checkout/profiler/zLoadProfiler/zLoadProfiler/src/com/selenium/zLoadProfilerPkg/; javac -cp ".:/home/sgalkov/zpp_tech_git_checkout/profiler/selenium-2.30.0/selenium-java-2.30.0.jar:/home/sgalkov/zpp_tech_git_checkout/profiler/selenium-2.30.0/libs/*:/home/sgalkov/zpp_tech_git_checkout/profiler/selenium-2.30.0/selenium-server-standalone-2.30.0.jar:/home/sgalkov/zpp_tech_git_checkout/profiler/browsermob-proxy-2.0-beta-7/browsermob-proxy-2.0-beta-7-sources.jar:/home/sgalkov/zpp_tech_git_checkout/profiler/browsermob-proxy-2.0-beta-7/lib/*:/home/sgalkov/zpp_tech_git_checkout/profiler/zLoadProfiler/zLoadProfiler/src/com/selenium/zLoadProfilerPkg" Main.java 
Main.java:54: error: cannot find symbol 
    BrowsermobProxy bmp = new BrowsermobProxy(PROXY_API_HOST, PROXY_API_PORT); 
    ^
symbol: class BrowsermobProxy 
location: class Main 

Main.java:54: error: cannot find symbol 
    BrowsermobProxy bmp = new BrowsermobProxy(PROXY_API_HOST, PROXY_API_PORT); 
          ^
symbol: class BrowsermobProxy 
location: class Main 

Main.java:310: error: cannot find symbol 
     HarStorage hs = new HarStorage(HARSTORAGE_HOST, HARSTORAGE_PORT); 
     ^
symbol: class HarStorage 
location: class Main 

Main.java:310: error: cannot find symbol 
     HarStorage hs = new HarStorage(HARSTORAGE_HOST, HARSTORAGE_PORT); 
          ^
symbol: class HarStorage 
location: class Main 

4 errors 
[[email protected] zLoadProfilerPkg]$ 

如果我注释掉“package com.selenium.zLoadProfilerPkg;”在4个文件中的每一个中并逐一编译它们,一切正常。

而且,如果我尝试编译这样说:

cd /home/sgalkov/zpp_tech_git_checkout/profiler/zLoadProfiler/zLoadProfiler/src/com/selenium/zLoadProfilerPkg/; 

javac -cp ".\ 
:/home/sgalkov/zpp_tech_git_checkout/profiler/selenium-2.30.0/selenium-java-2.30.0.jar\ 
:/home/sgalkov/zpp_tech_git_checkout/profiler/selenium-2.30.0/libs/*\ 
:/home/sgalkov/zpp_tech_git_checkout/profiler/selenium-2.30.0/selenium-server-standalone-2.30.0.jar\ 
:/home/sgalkov/zpp_tech_git_checkout/profiler/browsermob-proxy-2.0-beta-7/browsermob-proxy-2.0-beta-7-sources.jar\ 
:/home/sgalkov/zpp_tech_git_checkout/profiler/browsermob-proxy-2.0-beta-7/lib/*\ 
:/home/sgalkov/zpp_tech_git_checkout/profiler/zLoadProfiler/zLoadProfiler/src/com/selenium/zLoadProfilerPkg" \ 
BrowsermobProxy.java HarStorage.java HttpRequest.java Main.java 

它编译,但我得到一个额外的类Main.java

rw-r--r-- 1 sgalkov users 1422 Mar 11 20:30 Main$1.class 
rw-r--r-- 1 sgalkov users 8264 Mar 11 20:30 Main.class 
rw-r--r-- 1 sgalkov users 14864 Mar 11 19:32 Main.java 

,我无法运行程序,我得到的错误:

Exception in thread "main" java.lang.NoClassDefFoundError: Main (wrong name: com/selenium/zLoadProfilerPkg/Main) 
    at java.lang.ClassLoader.defineClass1(Native Method) 

我环顾四周,并尝试各种选项,但不能让这个项目编译并会欣赏任何指针。

+0

Main $ 1。类不是一个“额外”类,它是一个内部类(通常)。你在Main.java中有内部类吗? (即使是匿名的内部类) – 2013-03-12 00:41:28

+1

另外,你通常会编写一个小脚本来处理类路径,如果你需要在* nix shell中定期构建这个脚本。或者你可以使用ant/maven /等。另一种选择(如果你不是经常在* nix上构建它的话)将只是(从Eclipse中导出)(因为你说它在Eclipse中起作用,导出为JAR)。从IDE导出不是一个好习惯,但是如果您需要在一次性或非常罕见的基础上进行操作,它就会起作用。 – 2013-03-12 00:44:42

+0

谢谢我发现内部类 – Kentor 2013-03-12 18:58:30

回答

1
dir=/home/sgalkov/zpp_tech_git_checkout/profiler 

cd "$dir/zLoadProfiler/zLoadProfiler/src/" 

javac -cp ".\ 
:$dir/selenium-2.30.0/selenium-java-2.30.0.jar\ 
:$dir/selenium-2.30.0/libs/*\ 
:$dir/selenium-2.30.0/selenium-server-standalone-2.30.0.jar\ 
:$dir/browsermob-proxy-2.0-beta-7/browsermob-proxy-2.0-beta-7-sources.jar\ 
:$dir/browsermob-proxy-2.0-beta-7/lib/*\ 
:$dir/zLoadProfiler/zLoadProfiler/src/" \ 
com/selenium/zLoadProfilerPkg/*.java 
+0

这个工程,但我仍然得到一个主要$ 1.class文件 – Kentor 2013-03-12 18:48:03

+0

实际上,我发现内部类,谢谢! – Kentor 2013-03-12 19:51:56

+0

有时最短的答案是最好的,因为Genius是简单的:) – 2013-03-12 20:25:50

0

如果你想编译你应该使用Apache Ant一个IDE之外的应用程序。这里有一个示例build.xml文件,您可以使用它来使用Ant编译您的应用程序。

<?xml version="1.0" encoding="UTF-8"?> 
<project basedir="/home/sgalkov/zpp_tech_git_checkout/profiler/zLoadProfiler/zLoadProfiler" 
    default="compile"> 

<property name="dir.prefix" value="/home/sgalkov/zpp_tech_git_checkout/profiler"/> 

<path id="compile.classpath"> 
    <pathelement location="classes"/> 
    <fileset dir="${dir.prefix}/selenium-2.30.0"> 
     <include name="selenium-java-2.30.0.jar"/> 
     <include name="libs/*"/> 
     <include name="selenium-server-standalone-2.30.0.jar"/> 
    </fileset> 
    <fileset dir="${dir.prefix}/browsermob-proxy-2.0-beta-7"> 
     <include name="browsermob-proxy-2.0-beta-7-sources.jar"/> 
     <include name="lib/*"/> 
    </fileset> 
</path> 
<property name="compile.classpath" refid="compile.classpath"/> 


<target name="compile"> 
    <mkdir dir="classes"/> 
    <javac failonerror="true" srcdir="src" debug="yes" 
     includes="**/*.java" destdir="classes" 
     classpath="${compile.classpath}"> 
    </javac> 
</target> 

<target name="clean"> 
    <delete dir="classes"/> 
</target> 

</project> 

所有的课程会与镜像源包层次的结构称为classes文件夹中结束。要执行您的应用程序,您可以将classes文件夹放在您的类路径中,并将您的主类调用为com.selenium.zLoadProfilerPkg.Main。在ant中有一些很好的功能,例如将你的类打包成一个jar文件,等等。

至于Main$1.class,请确保您的包定义在每个Java源文件的顶部都正确定义。

此外,一定要检查我提供的ant构建脚本中的compile.classpath,以确保我没有在您的问题中提供的类路径中拼错或表示某些内容。

0

您必须在源根目录中有一个子目录com(顶层包),开始javac。这也可以在Windows上测试。

你也可以部署已编译的.class'es/jars/wars /耳朵。那么需要编译的目标(1.5,1.6,1.7)。

是的,蚂蚁或时下行家可能会提供一个良好的基础设施建设,IDE和独立的内部。

+0

是的我同意,蚂蚁/ maven是一个好主意,但我只是想先得到这个工作:) – Kentor 2013-03-12 18:46:40

相关问题