Maven编译:找不到包

45

我有一个(看似)简单的maven问题,我无法解决。在我的POM中,我已经像这样指定了对openrdf-sesame的依赖:

<dependency>
     <groupId>org.openrdf.sesame</groupId>
     <artifactId>sesame-runtime</artifactId>
     <version>2.7.2</version>
</dependency>

在Eclipse中运行该项目效果很好,我甚至可以导出可运行的jar文件。 不幸的是,我不能通过命令行maven使其正常工作。 为了构建一个jar文件,我已经将以下内容添加到我的pom.xml文件:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>foo.bar.Cli</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

编译失败,出现以下错误:

.../PLDReducer.java:[25,29] package org.openrdf.rio.rdfxml does not exist
.../PLDReducer.java:[27,33] package org.openrdf.sail.nativerdf does not exist
.../LowPLDReducer.java:[25,29] package org.openrdf.rio.rdfxml does not exist
.../Cli.java:[23,33] package org.openrdf.sail.nativerdf does not exist
.../SchemaBuilder.java:[30,33] package org.openrdf.sail.nativerdf does not exist
.../RepoQuerier.java:[23,33] package org.openrdf.sail.nativerdf does not exist
.../PLDReducer.java:[78,44] cannot find symbol

奇怪的是,一旦我在pom中添加编译插件并更新项目设置,eclipse似乎也无法再进行编译。 我已经检查了我的仓库,所有sesame文件都在里面。

运行“mvn --version”会输出以下内容:

Apache Maven 2.2.1 (rdebian-8)
Java version: 1.6.0_27
Java home: /usr/lib/jvm/java-6-openjdk-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux" version: "3.8.0-25-generic" arch: "amd64" Family: "unix"

我看到似乎指向了一个jre,但我的搜索表明,如果编译器本身未找到,则会看到另一个错误。

这里是完整的POM,如果有帮助的话。

我是否漏掉了什么? 我在我的POM中找不到任何错误。


你能展示一下'mvn clean package'的完整输出吗? - khmarbaise
这里是使用-e开关的代码:http://pastebin.com/zg24L8rS,以及使用-X开关的代码:http://pastebin.com/A5G613LL。 - feob
看起来你正在使用不存在的包名(可能是在导入部分)。你真的需要这些包吗?是否使用了其中的类?可以使用IDE(例如Eclipse)清理导入部分吗?你能展示一个源代码文件,比如PLDReducer.java吗? - khmarbaise
PLDReducer.java - 我肯定使用了openrdf包,而且我相信它们是正确的。我可以从eclipse编译和运行我的项目。 - feob
4个回答

21

你需要将以下依赖项添加到你的构建中:

<dependency>
    <groupId>org.openrdf.sesame</groupId>
    <artifactId>sesame-rio-api</artifactId>
    <version>2.7.2</version>
</dependency>

此外,我建议深入研究有关如何使用该库的文档。


谢谢,这真的解决了问题!但是如果需要这个额外的模块,那么在Eclipse中如何编译和运行项目呢?我没有在lib文件夹或类似位置中找到任何jar文件。此外,链接的文档看起来很棒,我之前还没有看过! - feob
17
缺失的包是运行时依赖,这就是为什么从命令行进行编译会失败的原因。然而,Maven Eclipse插件倾向于忽略作用域规则,并拉取每个依赖项,这就是为什么从Eclipse进行编译没有问题的原因。 - Jeen Broekstra
你定义了哪种作用域? - khmarbaise
@khmarbaise - 你回答中的链接已经失效了 (http://openrdf.callimachus.net/sesame/2.7/docs/users.docbook?view#chapter-lib-install) 如果可能的话,你能否更新一个有效的链接? - Santosh Kumar

5

您的依赖项中没有包含<scope>标签。如果您添加它,您的依赖关系将变成以下形式:

<dependency>
     <groupId>org.openrdf.sesame</groupId>
     <artifactId>sesame-runtime</artifactId>
     <version>2.7.2</version>
     <scope> ... </scope>
</dependency>

"scope" 标签告诉Maven你的依赖在何时需要构建。可以在标签内填写“test”,“provided”或“runtime”的值(在pom文件中不需要引号)。由于我不知道你的依赖性是什么,因此无法告诉你选择哪个值。请参考Maven文档和您的依赖文档。


1
刚刚遇到了同样的问题,我把<scope>完全删除后,项目成功构建了。 - Damien-Amen
对我来说,删除作用域并没有起作用。我在使用命令行mvn clean install时仍然会收到“org.apache.log4j包不存在”的错误。但是当我从IntelliJ运行testng.xml时,它可以正常工作。 - MansoorShaikh

3

不确定是否存在文件损坏,但在确认正确的pom配置后,我通过删除本地m2仓库中的jar包来解决了这个问题,当我运行测试时,强制Maven重新下载它。


2

我也遇到了同样的问题,只需删除scope标签并成功构建即可。

“Original Answer”翻译成中文是“最初的回答”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接