[已解决] - 但仍在寻找解释。请参阅问题底部
我对命令行或Maven没有多少经验。我正在编写一本书的教程。它声明我应该创建一个java文件
src/main/java/com/effectivemaven/chapter01/ExampleAction.java
我所做的是 mkdir
每个目录,即mkdir com
,mkdir effectivemaven
,mkdir chapter01
我在chapter01
目录中创建.java文件。
package com.effectivemaven.chapter01;
import org.slf4j.*;
public class ExampleAction {
final Logger logger = LoggerFactory.getLogger(ExampleAction.class);
public boolean execute() {
logger.info( "Example Action Executed." );
return true;
}
}
当我mvn compile
时,它显示compiling 1 file to target...
,但是当我查看taget目录时,没有创建任何内容。
所以我尝试在不使用包的情况下创建另一个.java文件,只是一个简单的
public class Hello {
public static void main(String[] args) {
System.out.println("Hello");
}
}
在java
目录中,然后mvn compile
,它会显示在target
文件中。
所以我的假设是我没有使用mkdir
正确创建包,或者我可能做了其他错误我不知道的事情。
所以基本上我只是想知道,从命令行创建包的正确方法是什么?如果我正确地做到了,那么
.class
中没有创建target
的其他可能原因是什么?
编辑树
first-webapp
src
main
java
Hello.java
com
effectivemaven
chapter01
ExampleAction.java
target
classes
Hello.class
pom.xml
从C:\Maven Book\first-webapp>
C:\Maven Book\first-webapp>mvn compile
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building first-webapp Maven Webapp 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ first-weba
pp ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ first-webapp
---
[WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. b
uild is platform dependent!
[INFO] Compiling 2 source files to C:\Maven Book\first-webapp\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.667s
[INFO] Finished at: Sun Jan 12 00:09:49 PST 2014
[INFO] Final Memory: 11M/111M
[INFO] ------------------------------------------------------------------------
C:\Maven Book\first-webapp>
编辑 pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.underdogdevs.webapp</groupId>
<artifactId>first-webapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>first-webapp Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
</dependencies>
<build>
<finalName>first-webapp</finalName>
</build>
</project>
顺便说一句,这是我使用以下命令创建的网络应用程序
mvn archetype-generate -DgroupId=com.underdogdevs.webapp -DartifactId=first-webapp -DarchetypeArtifactid=maven-archetype-webapp
[已解决] - 但具有非常简单的理解 - 仍然为任何可以向我解释此行为的人提供布朗尼点数。以下是我做的事情
我得到了它的工作。由于我使用
groupId=com.underdogdevs.webapp
创建项目,因此我尝试创建一个包com\underdogdevs\webapp
并创建一个具有相应包引用的类。这解决了这个问题。上课了。但我进一步测试了它并删除了我刚刚创建的包并尝试仅使用原始包结构进行清理和编译,但文件在原始包结构中再次出现。我不知道为什么会这样。有人有任何想法吗?
答案 0 :(得分:1)
好的,groupid
与您的应用程序结构无关 - 它是您的应用程序名称的一部分。您正在构建一个webapp,因此编译的类进入生成的war文件中的WEB-INF/classes
目录(根据您的pom称为first-webapp.war
),可以在target
中找到目录。您需要目录src/main/java
,src/main/resources
,src/test/java
,src/test/resources
,src/main/webapp/WEB-INF
。在java目录下,您应该放置您的包结构(更多目录),在这种情况下是com/effectivemaven/chapter01
,并在其下放置您的java文件ExampleAction.java
。将您的pom
放入项目根目录中。
在命令行上运行mvn clean install
,您将生成目标,然后您应该在其中找到.war
文件。在那里,在WEB-INF/classes/com/effectivemavem/chapter01
目录下,您将找到带有.class
扩展名的已编译java类。
在某些时候,您必须将web.xml
文件放在WEB-INF
目录中。