我一直在寻找一种能够向您显示未使用的家属的工具。我很快就偶然发现了maven命令mvn dependency:analyze
。这样做的问题是,它经常会检测到“未使用”的依赖关系,如果丢失则会导致构建失败。
以下是优化项目的示例:
$ mvn dependency:analyze
[INFO] Building LogfileTool 0.1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-dependency-plugin:2.8:analyze (default-cli) > test-compile @ LogfileTool >>>
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ LogfileTool ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ LogfileTool ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 7 source files to C:\Projects\LogfileToolMa\LogfileTool\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ LogfileTool ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\Projects\LogfileToolMa\LogfileTool\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ LogfileTool ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] <<< maven-dependency-plugin:2.8:analyze (default-cli) < test-compile @ LogfileTool <<<
[INFO]
[INFO] --- maven-dependency-plugin:2.8:analyze (default-cli) @ LogfileTool ---
[WARNING] Unused declared dependencies found:
[WARNING] log4j:apache-log4j-extras:jar:1.2.17:compile
[WARNING] org.projectlombok:lombok:jar:1.16.18:provided
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
Pom.xml中的依赖项
<dependencies>
<!-- Logger -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>apache-log4j-extras</artifactId>
<version>1.2.17</version>
</dependency>
<!-- Generating Getter, Setter etc. -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
<type>jar</type>
</dependency>
</dependencies>
Lombok使用的包是:
lombok.AccessLevel
lombok.Data
lombok.Getter
lombok.Setter
通过从我的POM中删除lombok,我通过构建项目获得以下错误
-------------------------------------------------------------
COMPILATION ERROR :
-------------------------------------------------------------
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[7,14] package lombok does not exist
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[8,14] package lombok does not exist
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[9,14] package lombok does not exist
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[10,14] package lombok does not exist
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[26,2] cannot find symbol
symbol: class Data
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[13,14] package lombok does not exist
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[14,14] package lombok does not exist
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[15,14] package lombok does not exist
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[16,14] package lombok does not exist
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[26,2] cannot find symbol
symbol: class Data
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[34,4] cannot find symbol
symbol: class Getter
location: class ch.glue.logfiletool.logfiletool.config_handler.LogfileSearchConfig
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[35,4] cannot find symbol
symbol: class Setter
location: class ch.glue.logfiletool.logfiletool.config_handler.LogfileSearchConfig
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[35,4] cannot find symbol
symbol: class Getter
location: class ch.glue.logfiletool.logfiletool.config_handler.LogfileParseConfig
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[36,4] cannot find symbol
symbol: class Setter
location: class ch.glue.logfiletool.logfiletool.config_handler.LogfileParseConfig
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[62,7] cannot find symbol
symbol: method setXmlToRead(java.lang.String)
location: class ch.glue.logfiletool.logfiletool.config_handler.LogfileSearchConfig
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[63,7] cannot find symbol
symbol: method setPathToLogfiles(java.lang.String)
location: class ch.glue.logfiletool.logfiletool.config_handler.LogfileSearchConfig
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[63,7] cannot find symbol
symbol: method setPathForStorage(java.lang.String)
location: class ch.glue.logfiletool.logfiletool.config_handler.LogfileParseConfig
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[64,7] cannot find symbol
symbol: method setPathToLogfile(java.lang.String)
location: class ch.glue.logfiletool.logfiletool.config_handler.LogfileParseConfig
ch/glue/logfiletool/logfiletool/log_handler/LogfileReader.java:[93,50] cannot find symbol
symbol: method getPathToLogfiles()
location: variable logfileSearchConfig of type ch.glue.logfiletool.logfiletool.config_handler.LogfileSearchConfig
ch/glue/logfiletool/logfiletool/log_handler/LogfileReader.java:[95,100] cannot find symbol
symbol: method getXmlToRead()
location: variable logfileSearchConfig of type ch.glue.logfiletool.logfiletool.config_handler.LogfileSearchConfig
ch/glue/logfiletool/logfiletool/Main.java:[61,51] cannot find symbol
symbol: method getPathToLogfile()
location: variable logfileToolConfig of type ch.glue.logfiletool.logfiletool.config_handler.LogfileParseConfig
ch/glue/logfiletool/logfiletool/Main.java:[71,52] cannot find symbol
symbol: method getPathForStorage()
location: variable logfileToolConfig of type ch.glue.logfiletool.logfiletool.config_handler.LogfileParseConfig
22 errors
-------------------------------------------------------------
------------------------------------------------------------------------
BUILD FAILURE
------------------------------------------------------------------------
Total time: 1.747 s
Finished at: 2017-09-27T10:04:20+02:00
Final Memory: 14M/210M
------------------------------------------------------------------------
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project LogfileTool: Compilation failure: Compilation failure:
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[7,14] package lombok does not exist
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[8,14] package lombok does not exist
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[9,14] package lombok does not exist
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[10,14] package lombok does not exist
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[26,2] cannot find symbol
symbol: class Data
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[13,14] package lombok does not exist
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[14,14] package lombok does not exist
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[15,14] package lombok does not exist
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[16,14] package lombok does not exist
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[26,2] cannot find symbol
symbol: class Data
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[34,4] cannot find symbol
symbol: class Getter
location: class ch.glue.logfiletool.logfiletool.config_handler.LogfileSearchConfig
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[35,4] cannot find symbol
symbol: class Setter
location: class ch.glue.logfiletool.logfiletool.config_handler.LogfileSearchConfig
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[35,4] cannot find symbol
symbol: class Getter
location: class ch.glue.logfiletool.logfiletool.config_handler.LogfileParseConfig
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[36,4] cannot find symbol
symbol: class Setter
location: class ch.glue.logfiletool.logfiletool.config_handler.LogfileParseConfig
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[62,7] cannot find symbol
symbol: method setXmlToRead(java.lang.String)
location: class ch.glue.logfiletool.logfiletool.config_handler.LogfileSearchConfig
ch/glue/logfiletool/logfiletool/config_handler/LogfileSearchConfig.java:[63,7] cannot find symbol
symbol: method setPathToLogfiles(java.lang.String)
location: class ch.glue.logfiletool.logfiletool.config_handler.LogfileSearchConfig
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[63,7] cannot find symbol
symbol: method setPathForStorage(java.lang.String)
location: class ch.glue.logfiletool.logfiletool.config_handler.LogfileParseConfig
ch/glue/logfiletool/logfiletool/config_handler/LogfileParseConfig.java:[64,7] cannot find symbol
symbol: method setPathToLogfile(java.lang.String)
location: class ch.glue.logfiletool.logfiletool.config_handler.LogfileParseConfig
ch/glue/logfiletool/logfiletool/log_handler/LogfileReader.java:[93,50] cannot find symbol
symbol: method getPathToLogfiles()
location: variable logfileSearchConfig of type ch.glue.logfiletool.logfiletool.config_handler.LogfileSearchConfig
ch/glue/logfiletool/logfiletool/log_handler/LogfileReader.java:[95,100] cannot find symbol
symbol: method getXmlToRead()
location: variable logfileSearchConfig of type ch.glue.logfiletool.logfiletool.config_handler.LogfileSearchConfig
ch/glue/logfiletool/logfiletool/Main.java:[61,51] cannot find symbol
symbol: method getPathToLogfile()
location: variable logfileToolConfig of type ch.glue.logfiletool.logfiletool.config_handler.LogfileParseConfig
ch/glue/logfiletool/logfiletool/Main.java:[71,52] cannot find symbol
symbol: method getPathForStorage()
location: variable logfileToolConfig of type ch.glue.logfiletool.logfiletool.config_handler.LogfileParseConfig
-> [Help 1]
To see the full stack trace of the errors, re-run Maven with the -e switch.
Re-run Maven using the -X switch to enable full debug logging.
For more information about the errors and possible solutions, please read the following articles:
[Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
如果没有log4j-extras,我会通过运行Project
获得以下错误log4j:ERROR Could not instantiate class [org.apache.log4j.rolling.RollingFileAppender].
java.lang.ClassNotFoundException: org.apache.log4j.rolling.RollingFileAppender
log4j和lombok都在我的Project中使用。你有一个想法如何解决这个或来自哪里?
提前谢谢
答案 0 :(得分:6)
我也遇到过将项目Lombok标记为dependency:analyze
作为Unused声明的依赖项的问题。项目Lombok完成了大部分神奇的编译时间,因此大多数注释在编译后都会被删除。这就是Maven的依赖分析器无法识别它的原因。以及为什么它也无法检测使用SPI加载的依赖项。
我们通过明确告诉Dependency分析器插件忽略Project Lombok来解决这个问题。这可以使用<usedDependency>
配置选项或更精细的<ignoreUnusedDeclaredDependency>
来完成:
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<ignoredUnusedDeclaredDependencies>
<ignoredUnusedDeclaredDependency>org.projectlombok:lombok</ignoredUnusedDeclaredDependency>
</ignoredUnusedDeclaredDependencies>
</configuration>
</plugin>
</plugins>
</pluginManagement>
关于范围的PS:Lombok是一个编译时依赖项,但不需要在运行时在类路径上(或者最终在你的lib文件夹中)。 provided
依赖关系声明jar应该存在以进行编译,但是在运行时它应该由运行时环境(例如,运行它的容器)提供。由于在运行时不需要Lombok,因此当运行时不提供Lombok时会出现问题,这与您对Maven依赖声明的期望相反。