【问题标题】:How do I set the Eclipse build path and class path from an Ant build file?如何从 Ant 构建文件中设置 Eclipse 构建路径和类路径?
【发布时间】:2011-01-25 03:25:50
【问题描述】:

关于 Ant 和 Eclipse 的讨论很多,但以前没有答案似乎对我有帮助。

这里是交易:我正在尝试构建一个 Java 程序,该程序可以从命令行成功地与 Ant 编译。 (为了进一步混淆问题,我试图编译的程序是 Ant 本身。)

我真正想做的是将这个项目引入 Eclipse 并让它在 Eclipse 中编译,以便正确解析类型绑定和变量绑定(来自 Eclipse JDT 的命名法)。我需要这个,因为我需要对构建在 Eclipse JDT 之上的代码进行静态分析。我将 Java 项目引入 Eclipse 以便 Eclipse 构建它并解决所有绑定的正常方法是将源目录导入 Java 项目,然后告诉它使用 src/main/ 目录作为“源目录” 。”

不幸的是,使用 Ant 执行此操作会导致构建失败并出现大量编译错误。在我看来,Ant 构建文件正在正确设置类路径和构建路径(可能通过排除某些源文件),而 Eclipse 没有此信息。

有没有办法获取嵌入在 Ant 构建文件中的类路径和构建路径信息,并将该信息提供给 Eclipse 以放入其 .project 和 .classpath 文件中?我已经尝试从现有的构建文件(文件菜单中的一个选项)创建一个新项目,但这没有帮助。该项目仍然有相同的编译错误。

谢谢, 内尔斯

【问题讨论】:

    标签: java eclipse ant build eclipse-jdt


    【解决方案1】:

    我从来没有找到一种真正干净的方法来做到这一点,但一种“hackish”的方法是操纵 .classpath eclipse 使用的文件(它包含构建路径)。

    所以 .classpath 里面会有这样的东西:

    <classpathentry kind="lib" path="C:/jboss-4.2.3.GA/client/jboss-system-client.jar"/>
    

    因此,例如,您可以编写某种批处理脚本等,它会读取您的 ant 文件依赖项并将它们放入 eclipse .classpath 文件中(当然是以正确的格式)。

    但就我个人而言,我从不愚弄这些事情。我所做的只是将我的项目需要的所有 jars 放在一个文件夹中,然后在我的 ant 文件中我有一个这样的路径设置:

    <path id="all_libs">
        <fileset dir="test_reflib">
            <include name="**/*.jar"/>
        </fileset>
    </path>
    

    test_reflib 只需定义到包含所有 jar 的该文件夹的任何位置。

    然后,在 Eclipse 端,您只需执行“添加 jars”并导航到同一个文件夹并选择所有 jars。更酷的是,任何时候你将新的 jars 放到这个文件夹中,只需在 eclipse 项目的根级别单击并执行“刷新”,然后编辑构建路径并再次单击添加 jar,它只会显示你的 jars您尚未添加到构建路径中(即您刚刚放入文件夹的新 jar)。

    如果您在中心位置共享 jar,这显然不太好用,但它适用于较小的项目,您只需将所有 jar 复制到项目的集中文件夹即可。

    【讨论】:

    • 谢谢,这很有帮助。我有点希望有人已经开发了你描述的那种脚本。特别是,这些构建文件有很多条件包含,我想自动解决它们。
    【解决方案2】:

    从原始的 ant 发行版中,首先运行“ant -f fetch.xml”(或类似的)以下载大量所需的依赖项。将这些添加到您的 Eclipse 项目中,看看是否有帮助。

    【讨论】:

    • 这不是我正在寻找的答案,但它很有帮助,谢谢。
    【解决方案3】:

    我们已经从 Ant 为一个大型项目生成了 Eclipse .classpath 和 .project 文件,其中包含位于中心的 jars (100+)(不包括 src jars 和 javadocs)。类似于从 here 链接的 build.xml,明显添加了 src 和 javadoc 属性。

    【讨论】:

      【解决方案4】:

      我使用 ivy 来管理我的 ANT 类路径,我强烈建议学习它是如何工作的。

      有一个eclipse plugin 将管理来自 ANT 用来定义其依赖项的同一 ivy.xml 文件的 eclipse 类路径。

      【讨论】:

        【解决方案5】:

        我编写了一个生成 Eclipse .userlibraries 文件的 Ant 任务。您可以导入生成的文件以在 Eclipse 中创建用户库。然后将此用户库用作构建路径的一部分。

        要使用该任务,请将其添加到您的 ant 构建文件中:

        <target name="createEclipseUserLibraries"
                description="Creates classpath and bootclasspatch that can be imported into Eclipse">
          <taskdef name="createEclipseUserLibraries"
                   classname="com.forumsys.tools.CreateEclipseUserLibraries"
                   classpathref="yourclasspathref"/>
          <createEclipseUserLibraries classpathref="classpathref" bootclasspathref="bootclasspathref"/>
        </target>
        

        蚂蚁任务。它需要 ant.jar 来运行和编译:

        import java.io.BufferedOutputStream;
        import java.io.File;
        import java.io.FileOutputStream;
        import java.io.IOException;
        
        import org.apache.tools.ant.BuildException;
        import org.apache.tools.ant.Project;
        import org.apache.tools.ant.Task;
        import org.apache.tools.ant.types.Path;
        import org.apache.tools.ant.types.Reference;
        
        /**
         * A custom tag to create a file the eclipse can import to setup a user libraries. 
         *
         * Created: Mar 29, 2014 9:44:09 AM
         *
         * @author <a href="mailto:jslopez@gmail.com">Javier S. López</a>
         * @version 1.0
         */
        public class CreateEclipseUserLibraries extends Task {
            public static final String UTF8_ENCODING = "UTF-8";
            public static final String DEFAULT_BOOT_CLASSPATH_LIBRARY_NAME = "SYSTEM_LIBRARY";
            public static final String DEFAULT_CLASSPATH_LIBRARY_NAME = "LIBRARY";
            public static final String DEFAULT_DESTINATION = "Eclipse.userlibraries";
            private static final String INDENT = "    ";
            private Path _classpath;
            private Path _bootClasspath;
            private String _bootClasspathLibraryName = DEFAULT_BOOT_CLASSPATH_LIBRARY_NAME;
            private String _classpathLibraryName = DEFAULT_CLASSPATH_LIBRARY_NAME;
            private String _destination = DEFAULT_DESTINATION;
        
            public void setClasspath(final Path classpath) {
                if (_classpath == null) {
                    _classpath = classpath;
                } else {
                    _classpath.append(classpath);
                }
            }
        
            public void setClasspathRef(final Reference reference) {
                if (_classpath == null) {
                    final Project antProject = getProject();
                    _classpath = new Path(antProject);
                }
                _classpath.setRefid(reference);
            }
        
            public void setBootClasspath(final Path bootClasspath) {
                if (_bootClasspath == null) {
                    _bootClasspath = bootClasspath;
                } else {
                    _bootClasspath.append(bootClasspath);
                }
            }
        
            public void setBootClasspathRef(final Reference reference) {
                if (_bootClasspath == null) {
                    final Project antProject = getProject();
                    _bootClasspath = new Path(antProject);
                }
                _bootClasspath.setRefid(reference);
            }
        
            public void setClasspathLibraryName(final String name) {
                if (!isEmpty(name)) {
                    _classpathLibraryName = name;
                }
            }
        
            public void setBootClasspathLibraryName(final String name) {
                if (!isEmpty(name)) {
                    _bootClasspathLibraryName = name;
                }
            }
        
            public void setDestination(final String argDestination) {
                if (!isEmpty(argDestination)) {
                    _destination = argDestination;
                }
            }
        
            @Override
            public void execute() throws BuildException {
                if (_classpath == null) {
                    throw new BuildException("classpath or classpathref attribute must be set");
                }
        
                if (_bootClasspath == null) {
                    throw new BuildException("bootclasspath or bootclasspathref attribute must be set");
                }
                try {
                    createUserLibrariesFile();
                } catch (final IOException e) {
                    throw new BuildException(e.getMessage(), e);
                }
            }
        
            /**
             * @throws IOException
             *
             */
            private void createUserLibrariesFile() throws IOException {
                final StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append("<?final xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
                stringBuilder.append("\n");
                stringBuilder.append("<eclipse-userlibraries version=\"2\">").append("\n");
                createBootClasspathLibrary(stringBuilder);
                createClasspathLibrary(stringBuilder);
                stringBuilder.append("</eclipse-userlibraries>");
        
                final Project antProject = getProject();
                final File baseDir = antProject.getBaseDir();
                final File file = new File(baseDir, _destination);
                if (file.exists()) {
                    file.delete();
                }
                final boolean append = false;
                BufferedOutputStream bos = null;
                try {
                    final FileOutputStream fos = new FileOutputStream(file, append);
                    bos = new BufferedOutputStream(fos);
                    bos.write(stringBuilder.toString().getBytes(UTF8_ENCODING));
                    bos.flush();
                } finally {
                    if (bos != null) {
                        bos.close();
                    }
                }
            }
        
            /**
             * @param stringBuilder
             *
             */
            private void createBootClasspathLibrary(final StringBuilder stringBuilder) {
                createLibrary(stringBuilder, _bootClasspathLibraryName, true, _bootClasspath);
            }
        
            /**
             * @param stringBuilder
             */
            private void createClasspathLibrary(final StringBuilder stringBuilder) {
                createLibrary(stringBuilder, _classpathLibraryName, false, _classpath);
            }
        
            /**
             * @param stringBuilder
             * @param bootClasspathLibraryName
             * @param b
             * @param bootClasspath
             */
            private void createLibrary(final StringBuilder stringBuilder, final String libraryName,
                final boolean isSystemLibrary, final Path path) {
                stringBuilder.append(INDENT).append("<library name=\"").append(libraryName);
                stringBuilder.append("\" systemlibrary=\"").append(Boolean.toString(isSystemLibrary)).append("\">\n");
                final String[] paths = path.list();
                final Project antProject = getProject();
                final File baseDir = antProject.getBaseDir();
                final String baseDirName = baseDir.getName();
        
                for (final String strPath : paths) {
                    final int index = strPath.indexOf(baseDirName);
                    //Only include the relative path
                    if (index != -1) {
                        stringBuilder.append(INDENT).append(INDENT);
                        stringBuilder.append("<archive path=\"").append(
                            strPath.substring(index - 1)).append("\"/>\n");
                    }
                }
        
                stringBuilder.append(INDENT).append("</library>\n");
            }
        
            public static final boolean isEmpty(final String str) {
                return (str == null) || (str.length() == 0);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2017-02-20
          • 1970-01-01
          • 2023-03-04
          • 2011-09-19
          • 1970-01-01
          • 2016-09-27
          • 1970-01-01
          • 1970-01-01
          • 2015-03-14
          相关资源
          最近更新 更多