无法从 eclipse 项目构建路径中的 apache ivy 依赖项导入类

Posted

技术标签:

【中文标题】无法从 eclipse 项目构建路径中的 apache ivy 依赖项导入类【英文标题】:can not import class from apache ivy dependencies in eclipse project build path 【发布时间】:2014-12-27 09:18:52 【问题描述】:

您好,我是 apache ant 和 ivy 的新手。我最近知道 ant 不支持依赖管理。所以我听说了 IVY,它是 ant 的依赖管理器。现在问题是,我已将 ivy 依赖添加到 ivy.xml文件

<ivy-module version="2.0">
    <info organisation="com.mlen" module="testApp"/>
    <dependencies>    
    <dependency org="net.sourceforge.jdatepicker" name="jdatepicker" rev="1.3.2"/>
    </dependencies>
</ivy-module>

这是一个用于摇摆应用程序的 jdatepicker。 现在的问题是当我尝试访问依赖类时,它不会导入类。 ivy 将依赖项下载到项目目录下的 lib 文件夹中。

我的 build.xml 文件

<project name="HelloWorld" 
      basedir="." 
      default="run">
<!--      xmlns:ivy="antlib:org.apache.ivy.ant">-->

    <property name="src.dir"     value="src"/>
    <property name="lib.dir"     value="lib"/>
    <property name="build.dir"   value="build"/>
    <property name="classes.dir" value="$build.dir/classes"/>
    <property name="jar.dir"     value="$build.dir/jar"/>
    <property name="main-class"  value="com.mlen.testApp.HelloWorld"/>

    <path id="classpath">
        <fileset dir="$lib.dir" includes="**/*.jar"/>
    </path>

    <target name="clean">
        <delete dir="$build.dir"/>
    </target>

    <target name="resolve" xmlns:ivy="antlib:org.apache.ivy.ant">
        <ivy:retrieve/>
    </target>

    <target name="compile" depends="resolve">
        <mkdir dir="$classes.dir"/>
        <javac includeantruntime="false" srcdir="$src.dir" destdir="$classes.dir" classpathref="classpath"/>
        <copy todir="$classes.dir">
            <fileset dir="$src.dir" excludes="**/*.java"/>
        </copy>
    </target>

    <target name="jar" depends="compile">
        <mkdir dir="$jar.dir"/>
        <jar destfile="$jar.dir/$ant.project.name.jar" basedir="$classes.dir">
            <manifest>
                <attribute name="Main-Class" value="$main-class"/>
                <!--how can i get ivy to note what the class path should be?-->
                <attribute name="Class-Path" value="log4j-1.2.17.jar"/>
            </manifest>
        </jar>
    </target>

    <target name="run" depends="jar">
        <java fork="true" classname="$main-class">
              <classpath>
                <path refid="classpath"/>
                <path location="$jar.dir/$ant.project.name.jar"/>
            </classpath>
        </java> 
    </target>

    <target name="clean-build" depends="clean,jar"/>
    <target name="main" depends="clean,run"/>
</project>

最后是我的主要课程。

public class HelloWorld extends JFrame 

    public HelloWorld()
        UtilDateModel model = new UtilDateModel();
        JDatePanelImpl datePanel = new JDatePanelImpl(model);
        JDatePickerImpl datePicker = new JDatePickerImpl(datePanel);

        add(datePicker);
        setSize(300, 200);
        setVisible(true);
    




    public static void main(String[] args) 
     new HelloWorld();

    


为什么不导入类。我做得对吗????

【问题讨论】:

与您的问题没有直接关系,但有一个更新版本的 JDatePicker 可用,其中包含许多错误修复:search.maven.org/#browse%7C-1191578160 【参考方案1】:

我创建了与您相同的文件结构,ivy.xml 和 build.xml 中没有错误,并且 ant run 任务运行良好。 Ivy 按预期解析了 jar 文件,并且 ant 目标在类路径中包含正确的目录。我认为您只是忘记将类导入 HelloWorld.java

import net.sourceforge.jdatepicker.impl.UtilDateModel;
//TODO import more

为避免这些错误,您可以使用 IDE(Eclipse、Netbeans、Idea w/e),它们都支持 Ant 和 Ivy。

如果您没有忘记导入类。您需要更加具体并找到您的 ant 目标失败的阶段。

如果是compile 尝试回显classpath 并运行相同的蚂蚁 带有javac src/HelloWorld.java -cp ./lib/jdatepicker-1.3.2.jar 的命令和您的类路径。 如果是run,用同样的方法试试java -jar ...

【讨论】:

因此您需要将 jdatepicker.jar 包含到 IDE 的项目设置库中 是的。像普通项目一样,当我们需要外部 jar 文件时,我们只需使用 eclispe 将其添加到类路径中。这正是我想要的。【参考方案2】:

Ivy 是 ANTnot eclipse 的依赖管理。如果你想让 ivy 解析 Eclipse 类路径,你需要安装 ivy 插件(参见ivyDE)

你的例子也适用于我。正如@deathangel908 指出的那样,您需要正确设置包声明并从第 3 方 jar 中导入类。

├── build.xml
├── ivy.xml
└── src
    └── com
        └── mlen
            └── testApp
                └── HelloWorld.java

HelloWorld.java

package com.mlen.testApp;

import javax.swing.*;
import net.sourceforge.jdatepicker.impl.*;

public class HelloWorld extends JFrame 

    public HelloWorld()
        UtilDateModel model = new UtilDateModel();
        JDatePanelImpl datePanel = new JDatePanelImpl(model);
        JDatePickerImpl datePicker = new JDatePickerImpl(datePanel);

        add(datePicker);
        setSize(300, 200);
        setVisible(true);
    


    public static void main(String[] args) 
     new HelloWorld();

    


【讨论】:

以上是关于无法从 eclipse 项目构建路径中的 apache ivy 依赖项导入类的主要内容,如果未能解决你的问题,请参考以下文章

从eclipse中的另一个java项目导入

Eclipse“此编译单元不在java项目的构建路径上”

Eclipse Java 构建路径

使用 Eclipse:如何为所有 C/C++ 项目添加包含路径和库

eclipse无法导入项目

在 Eclipse 中设置 EJB 构建类路径