从命令行创建Java包的正确方法是什么? (与Maven的麻烦)

时间:2014-01-12 07:36:05

标签: java maven command-line packages

[已解决] - 但仍在寻找解释。请参阅问题底部


我对命令行或Maven没有多少经验。我正在编写一本书的教程。它声明我应该创建一个java文件

src/main/java/com/effectivemaven/chapter01/ExampleAction.java

我所做的是 mkdir 每个目录,即mkdir commkdir effectivemavenmkdir 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并创建一个具有相应包引用的类。这解决了这个问题。上课了。但我进一步测试了它并删除了我刚刚创建的包并尝试仅使用原始包结构进行清理和编译,但文件在原始包结构中再次出现。我不知道为什么会这样。有人有任何想法吗?

1 个答案:

答案 0 :(得分:1)

好的,groupid与您的应用程序结构无关 - 它是您的应用程序名称的一部分。您正在构建一个webapp,因此编译的类进入生成的war文件中的WEB-INF/classes目录(根据您的pom称为first-webapp.war),可以在target中找到目录。您需要目录src/main/javasrc/main/resourcessrc/test/javasrc/test/resourcessrc/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目录中。