2013-03-12 3 views
0

Я могу скомпилировать файл Main.java без каких-либо проблем в Eclipse.Как скомпилировать java-файлы в linux с пакетом

Внутри 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]$ 

Если я закомментировать "пакет 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

Главный класс $ 1.class не является «лишним» классом, это внутренний класс (обычно). У вас есть внутренний класс в Main.java? (Даже анонимный внутренний класс?) –

+1

Также вы обычно пишете небольшой скрипт для обработки пути к классам и, если вам нужно его регулярно создавать в оболочке * nix. Или вы можете использовать ant/maven/etc. Другая альтернатива (если вы не создаете ее регулярно на * nix) должна была бы просто (кашлять) экспортировать ее из Eclipse (так как вы говорите, что она работает в Eclipse, экспортируется как JAR). Экспорт из среды IDE Не является хорошей привычкой вступать, но если вам нужно делать это на разовой или очень редкой основе, это работает. –

+0

спасибо, что я нашел внутренний класс – Kentor

ответ

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

+0

на самом деле, я нашел внутренний класс, спасибо! – Kentor

+0

иногда самый короткий ответ - лучший, потому что Genius - это простота :) –

0

Если вы хотите скомпилировать приложение вне интегрированной среды разработки, вы должны использовать Apache Ant. Вот пример файла 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.

Кроме того, не забудьте проверить compile.classpath в скрипте сборки муравья, который я предоставил, чтобы убедиться, что я не ошибался или не представлял что-то из класса, который вы указали в своем вопросе.

0

Вы должны запустить javac в исходном корневом каталоге, где есть подкаталог com (верхний пакет). Это можно проверить и на Windows.

Вы можете развернуть скомпилированные .class'es/jars/wars/ears. Затем требуется цель компиляции (1.5, 1.6, 1.7).

И да, муравей или ныне Maven может обеспечить хорошую инфраструктуру сборки, как внутри IDE и автономно.

+0

да, я согласен, ant/maven - хорошая идея, но я просто пытаюсь получить эту работу сначала :) – Kentor

Смежные вопросы