2012-10-02 5 views
0

나는 자바 프로그램을 가지고 있으며 리눅스에서 컴파일하기 위해 메이크 파일을 작성한다. 나는 리눅스 명령 종료 "실행 만들"사용하는 경우 예외메이크 파일, main 함수, ClassNotFound

# My project require 3 parameters from user input. 

default: Run.class 
Run.class: src/adb/Bing_WebResults/Run.java 
    javac -sourcepath src/ -classpath lib/*.jar -d bin/ src/adb/Bing_WebResults/*.java src/adb/jsonModels/*.java src/adb/models/*.java 


run: 
    java -classpath bin/:lib/*.jar Run "$(ARG1)" "$(ARG2)" "$(ARG3)" 

:

이 같은 조직 내 프로젝트 (Run.java는 주요 항목)

Program - 
    Src - 
     (package)adb.Bing_WebResults 
      Run.java 
     (package)adb.jsonModel 
      *.java 
     (package)adb.models 
      *.java 
    bin - 

    lib - 
     gson.jar 
     commons.jar 

    resource - 
     *.txt 

내 메이크입니다 "주 클래스를 찾을 수 없습니다 : 실행"

내 makefile에 문제가 있습니까? 잘못된 길인가?

답변

0

잠재적으로 잘못 될 수있는 많은 사항이 있지만 가장 명백한 문제는 makefile에서 대상의 잘못된 종속성입니다.

우선 대상 runRun.class에 종속되어야합니다. make run을 수행하는 경우 makerun이라는 대상을 찾습니다. makefile에서이 대상에는 정의 된 종속성이 없으며 실제로 컴파일 된 클래스 Run.class이 있는지 여부를 확인하지 않고 java ... 행을 실행합니다. 결과적으로 깨끗한 상황에서 make run을 수행하면 소스 코드가 컴파일되지 않고 컴파일 된 클래스가 없기 때문에 java 명령이 실패합니다.

Run.class이 작업 디렉토리가 아닌 bin 디렉토리에 있기 때문에 default의 종속성이 Run.class 일 때 올바르지 않습니다. 아래 라인은 목표가 Run.class 인 것을 나타냅니다.

메이크 파일을 향상시키는 데는 몇 가지 방법이 있습니다. 반복 된 표현을 피하기 위해 몇 가지 변수를 추가하여 수정 된 코드의 예를 아래에서보십시오. 이 방법은 스타일과 선호도의 문제입니다.

BINDIR := bin 
RUNCLASS := Run 
RUNBINARY := $(BINDIR)/$(RUNCLASS).class 
SRCDIR := src/adb/Bing_WebResults 
RUNSRC := $(SRCDIR)/$(RUNCLASS).java 

# Note: the default target below is superfluous at this moment 
default: $(RUNBINARY) 
$(RUNBINARY): $(RUNSRC) 
     javac -sourcepath src/ -classpath lib/*.jar -d $(BINDIR) $(SRCDIR)/*.java src/adb/jsonModels/*.java src/adb/models/*.java 

run: $(RUNBINARY) 
     java -classpath $(BINDIR):lib/*.jar $(RUNCLASS) "$(ARG1)" "$(ARG2)" "$(ARG3)" 

이 단순화, 비슷한 설정에서 나를 위해 작동 - 그것은뿐만 아니라 당신을 위해 작동 할 수 있습니다. 제공 한 스 니펫을 보면 makefile을 올바르게 완료하기 위해 추가해야 할 다른 종속성이나 변경 사항이있을 수 있습니다. 잠재적으로 패키지 정보를 실행 명령 및 종속성 표현식에 추가해야 할 수도 있지만 소스 코드에 따라 다릅니다. 게시물에 완벽한 솔루션을 제공하기에 충분한 정보가 없습니다.

피씨 :이 코드를 자신의 makefile에 복사하면 탭으로 공백을 바꾸는 것을 잊지 마십시오.

0

마침내 기본 패키지에 기본 클래스가없는 것 같아 실행 중에 패키지를 지정해야합니다. (1) 실행 패키지에, 그래서 메이크에서 "adb.Bing_WebResults.Run.class"을해야합니다 :

java -classpath bin com.example.Run arg1 arg2 ... 
0

이 두 지점은주의해야한다고 밝혀졌습니다.

(2) 외부 jar 파일에 의해 연결될 수 있어야합니다 (예를 들어, lib 디렉토리 /에 a.jar : lib 디렉토리/b.JAR가) 좋은

+0

당신이 이러한 오류를 발견 읽을 수 있습니다. 귀하의 메이크 파일 여전히 수정 필요합니다. 예를 들어'make '를 여러 번하면 코드가 여러 번 컴파일됩니다. 맞습니까? –