JAVA COMPILER API - 无法找到外部类文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA COMPILER API - 无法找到外部类文件相关的知识,希望对你有一定的参考价值。

我有一个简单的代码来编写Java代码

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.tools.*;
import java.io.*;
import java.util.*;

public class Compiler extends JFrame
{
    String loc="D:java";
    File file=null,
         dir=null;
    boolean success;
    public Compiler()
    {
        super("Highlight example");
        try 
        {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } 
        catch (Exception evt) {}
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new GridLayout(1,2));

        JTextPane textPane = new JTextPane();
        JTextArea debug=new JTextArea();
        JButton comp=new JButton("Compile"),
                browse=new JButton("...");

        JTextArea location=new JTextArea();

        JPanel right=new JPanel(),
               up=new JPanel();

        up.setLayout(new BorderLayout());
        up.add(new JScrollPane(location),"Center");
        up.add(browse,"East");

        right.setLayout(new BorderLayout(2,1));
        right.add(up,BorderLayout.NORTH);
        right.add(new JScrollPane(textPane), "Center");
        right.add(comp,"South");
        add(right);
        add(new JScrollPane(debug));
        setSize(800, 400);
        setVisible(true);

        browse.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                success=false;
                UIManager.put("FileChooser.readOnly", Boolean.TRUE);
                JFileChooser fc = new JFileChooser(loc);
                int status = fc.showOpenDialog(new JFrame());
                if (status==JFileChooser.APPROVE_OPTION)
                {
                    debug.setText("");
                    file = fc.getSelectedFile();
                    dir = fc.getCurrentDirectory();
                    try
                    {
                        textPane.read(new FileReader(file), null);
                    }
                    catch(Exception ex)
                    {

                    }
                }
            }
        });

        comp.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                try
                    {   
                        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
                        DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
                        StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
                        Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromStrings(Arrays.asList(file+""));
                        String[] option=new String[]{"-g","-parameters"};
                        Iterable<String> options = Arrays.asList(option);
                        JavaCompiler.CompilationTask task=null;

                        fileManager.setLocation(javax.tools.StandardLocation.CLASS_OUTPUT, Arrays.asList(dir));

                        task = compiler.getTask(null, fileManager, diagnostics, options, null, compilationUnits);
                        success = task.call();

                        fileManager.close();
                 //     System.out.println("Success: " + success);
                        if(success==true)
                        {
                            debug.setText("Success");
                        }
                        else
                        {
                            int i=1;
                            for (Diagnostic diagnostic : diagnostics.getDiagnostics())
                                if(diagnostic.getLineNumber()!=-1)
                                    debug.append("Error on line "+diagnostic.getLineNumber()+" in "+ diagnostic+"
");
                        }
                    }
                    catch(Exception ex)
                    {

                    }
            }
        });
    }

    public static void main(String[]args)
    {
        new Compiler();
    }
}

我不知道为什么编译器之前找不到以前的代码结果。我不知道如何解决这个问题。

有关详细信息,我举了一个例子:

  1. 选择A.java select A.java
  2. A.java result A的内容
  3. 然后我选择B.java。看看A.java是用create A.class enter image description here编译的
  4. B.java无法编译,因为它无法找到class A enter image description here

而且在包文件夹里面也找不到类。

这是例2:

enter image description here

A.java已使用create folder <path>a编译

enter image description here

并使用import访问类

enter image description here

我试了一下

来自:

fileManager.setLocation(javax.tools.StandardLocation.CLASS_OUTPUT, Arrays.asList(dir));

至 :

fileManager.setLocation(javax.tools.StandardLocation.CLASS_PATH, Arrays.asList(dir));

但它不起作用

答案

除了设置javax.tools.StandardLocation.CLASS_OUTPUT之外,还需要将javax.tools.StandardLocation.CLASS_PATH设置为包含放置上一个输出的位置:

fileManager.setLocation(javax.tools.StandardLocation.CLASS_OUTPUT, Arrays.asList(dir));
// Set dirClassPath to include dir, and optionally other locations
fileManager.setLocation(javax.tools.StandardLocation.CLASS_PATH, Arrays.asList(dirClassPath));
另一答案

您需要指定源路径目录和代码

String[] option=new String[]{"-g","-parameters"};

试试这个

String[] option=new String[]{"-g","-sourcepath", loc};

其中locB类的根目录。随着A妥善存储在自己的包内。

我已经尝试过你的代码,我修改了http://kurungkurawal.com/gifs/tut-compile.gif

另一答案

创建外部类的jar文件并使用编译器附加。

List<String> optionList = new ArrayList<String>();
        // set compiler's classpath to be same as the runtime's
optionList.addAll(Arrays.asList("-classpath", System.getProperty("java.class.path")
                + getValueFromPropertieFile("jarfile1;jarfile2")));

JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, optionList, null,
                compilationUnit);

以上是关于JAVA COMPILER API - 无法找到外部类文件的主要内容,如果未能解决你的问题,请参考以下文章

Atitit.java eval功能的实现  Compiler API

ionic-app-script在构建时失败 - 无法找到模块'@ angular / compiler-cli / ngtools2'

无法在项目上执行目标 org.apache.maven.plugins:maven-compiler-plugin (default-compile):致命错误编译:未找到 tools.jar

java.lang.IllegalAccessError:类 org.gradle.internal.compiler.java.ClassNameCollector 无法访问类 com.sun.to

尽管找到了 cuda,但 CMAKE_CUDA_COMPILER 标志为假

从 MATLAB Compiler 应用程序调用 python 时无法调用 python 库