2017-02-12 10 views
0

私は...このようなランタイムに依存する.javaをコンパイルするには?

何か別の.javaファイルをインポートする必要が.javaたくさんのファイルを持っている:

import package.c; 

public class A { 

    // do whatever that needs package.c 
} 

をしかし、私は唯一のpackage.c.javaを持っています。

私はJavaコンパイラや、私が知っている何か他のものを使用してコンパイルしようとすると、私は常にこれらのエラー

error: package <-package-> does not exist

かのようなものだ:私は必要があるためA.javaをコンパイルすることはできません

error: cannot find symbol

C.classコンパイルできないと別のものが必要になることがあります。

.javaが依存関係を必要としない場合はすべて問題ありません。これらの場合、Javaコンパイラはうまく動作します。

GetStartedGetStartedリンクが私の問題を解決する可能性がありますが、これを行う方法が見つかりません。

私のコンパイラのコードである[EDIT]:

私はパスを与えると、リストにそれらを追加すると同時に、すべてをコンパイルしようと、そこにすべての.javaファイルを見つける
File sourceDir = new File(source); 
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
    DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>(); 
    StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, Locale.getDefault(), null); 
    List<JavaFileObject> javaObjects = scanRecursivelyForJavaObjects(sourceDir, fileManager); 
    System.out.println(javaObjects.size()); 
    if (javaObjects.size() == 0) { 
     throw new CompilationError("There are no source files to compile in " + sourceDir.getAbsolutePath()); 
    } 
    String[] compileOptions = new String[]{"-d", sourceDir.getAbsolutePath()}; 
    Iterable<String> compilationOptions = Arrays.asList(compileOptions); 

    CompilationTask compilerTask = compiler.getTask(null, fileManager, diagnostics, compilationOptions, null, javaObjects); 

    if (!compilerTask.call()) {    
     for (Diagnostic<?> diagnostic : diagnostics.getDiagnostics()) { 
      System.err.format("Error on line %d in %s", diagnostic.getLineNumber(), diagnostic); 
     } 
     throw new CompilationError("Could not compile project"); 
    } 

。 mainllyこのhttps://docs.oracle.com/javase/7/docs/api/javax/tools/JavaCompiler.html

JavaCompiler.CompilationTask getTask(アウトライター、 JavaFileManagerファイルマネージャ、 DiagnosticListener diagnosticListener、 反復処理可能なオプション、 反復処理可能なクラス、 反復処理可能compilationUnits

+0

コードをコンパイルするために使用するコマンドラインを表示 – MeBigFatGuy

+0

同時にすべてのファイルをコンパイルしますか? – chrylis

+1

コンパイル時にクラスパスで依存関係を利用できるようにする必要があります。ソースとして、クラスファイルとしてコンパイルするか、Jarライブラリにパッケージ化します。 – MadProgrammer

答えて

0

Javadocは少し便利でした)

パラメータ:

  • out - コンパイラからの追加出力用のライタ。 nullの場合はSystem.errを使用する
  • fileManager - ファイルマネージャ。 nullの場合、コンパイラの標準ファイルマネージャーを使用する
  • diagnosticListener - 診断リスナー。 nullは
  • クラスの診断を報告するために、コンパイラのデフォルトのメソッドを使用している場合 - コンパイラオプション、ヌルの手段なしオプション
  • compilationUnits - - コンパイル単位注釈処理によって処理されるクラスの名前を、nullは、クラス名
  • オプションを意味しませんコンパイルする場合、nullはコンパイル単位を意味しません。

so .....

私はfollwing

package compileTest1; 
import java.io.File; 
import java.net.URL; 
import java.net.URLClassLoader; 
import java.util.Arrays; 
import java.util.Iterator; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.Locale; 

import javax.tools.Diagnostic; 
import javax.tools.DiagnosticCollector; 
import javax.tools.JavaCompiler; 
import javax.tools.JavaCompiler.CompilationTask; 
import javax.tools.JavaFileObject; 
import javax.tools.StandardJavaFileManager; 
import javax.tools.ToolProvider; 


public class MyCompiler { 

private File classesDir; 
private File sourceDir; 

public void loadClassesFromCompiledDirectory() throws Exception { 
    new URLClassLoader(new URL[]{classesDir.toURI().toURL()}); 
} 

public void compile() throws Exception { 
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
    DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>(); 
    StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, Locale.getDefault(), null); 
    List<JavaFileObject> javaObjects = scanRecursivelyForJavaObjects(sourceDir, fileManager); 

    if (javaObjects.size() == 0) { 
     throw new Exception("There are no source files to compile in " + sourceDir.getAbsolutePath()); 
    } 
    String[] compileOptions = new String[]{"-d", classesDir.getAbsolutePath()} ; 
    Iterable<String> compilationOptions = Arrays.asList(compileOptions); 

    CompilationTask compilerTask = compiler.getTask(null, fileManager, diagnostics, compilationOptions, null, javaObjects) ; 

    if (!compilerTask.call()) { 
     for (Diagnostic<?> diagnostic : diagnostics.getDiagnostics()) { 
      System.err.format("Error on line %d in %s", diagnostic.getLineNumber(), diagnostic); 
     } 
     throw new Exception("Could not compile project"); 
    } 
} 

private List<JavaFileObject> scanRecursivelyForJavaObjects(File dir, StandardJavaFileManager fileManager) { 
    List<JavaFileObject> javaObjects = new LinkedList<JavaFileObject>(); 
    File[] files = dir.listFiles(); 
    for (File file : files) { 
     if (file.isDirectory()) { 
      javaObjects.addAll(scanRecursivelyForJavaObjects(file, fileManager)); 
     } 
     else if (file.isFile() && file.getName().toLowerCase().endsWith(".java")) { 
      javaObjects.add(readJavaObject(file, fileManager)); 
     } 
    } 
    return javaObjects; 
} 


private JavaFileObject readJavaObject(File file, StandardJavaFileManager fileManager) { 
    Iterable<? extends JavaFileObject> javaFileObjects = fileManager.getJavaFileObjects(file); 
    Iterator<? extends JavaFileObject> it = javaFileObjects.iterator(); 
    if (it.hasNext()) { 
     return it.next(); 
    } 
    throw new RuntimeException("Could not load " + file.getAbsolutePath() + " java file object"); 
} 

public File getClassesDir() { 
    return classesDir; 
} 

public void setClassesDir(File classesDir) { 
    this.classesDir = classesDir; 
} 

public File getSourceDir() { 
    return sourceDir; 
} 

public void setSourceDir(File sourceDir) { 
    this.sourceDir = sourceDir; 
} 
} 

https://github.com/ishubin/blogix/blob/master/src/main/java/net/mindengine/blogix/compiler/BlogixCompiler.java

から取ったとの主な方法があるプロジェクトを開く:

public static void main(String[] args) { 
    MyCompiler compiler = new MyCompiler(); 
    compiler.setClassesDir(new File(".")); 
    compiler.setSourceDir(new File("C:\\Users\\...\\workspace\\compileTest\\src\\objectA")); 
    try { 
     compiler.compile(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

ObjectAには、彼のc'torにObjectBにしrecivedので、我々 AがBに依存していることをご存じですか? i番目のCMDでのjavacとなったエラー

私はCMDに入ったエラー: img1

プロジェクトのstructur: img2

もう一つ、私がしてファイルにCLASSESDIRを設定パス "コンパイルされたjavaファイルの.classファイルは、プロジェクトのbinフォルダに格納されます。

.javaファイルが2つの異なるパッケージにあるとき仕事がちょうどまた見つける:私がやった唯一の変更はCLASSESDIR値にあった img3

へ - > "... \ compileTest \ビン"

関連する問題