在与Maven合作一段时间后,我对Maven为构建体系结构带来的许多功能感到兴奋,特别是依赖管理.但是,我一次又一次遇到一个问题--Maven如何解决多模块项目之间的依赖关系.我想知道这是否是当前Maven实施的一个重大缺陷和/或是否有任何令人满意的解决方法.
假设我有一个多模块Maven项目.Parent pom包含三个模块 - moduleA(jar),moduleB(jar)和moduleC(war).B取决于A和C取决于B.简单吗?现在我想mvn dependency:go-offline在父项目上运行,该项目应该解析所有依赖项并将它们带入本地.m2目录.它失败了,因为Maven抱怨说当它作用于moduleB时它无法解决moduleA的依赖关系.因为所有这些模块都属于一个groupId,我甚至尝试使用它-DexcludeGroupIds=x.y.z来排除这些模块依赖关系,但它仍然在同一点上失败.
我理解为什么Maven抱怨 - moduleA还没有构建,因此当执行脱机目标时,我的本地或内部存储库中没有moduleA:jar工件.但IMHO插件应该以不同方式处理这些模块间依赖关系.在这种情况下,它应该简单地忽略它.有人可能会说我可以这样做mvn clean install,它会将moduleA:jar安装到本地存储库中.在那之后,运行mvn dependency:go-offline肯定会起作用.但是这种解决方法违背了这个离线目标的目的.这个插件允许我们解析并将依赖项拉入我们的本地存储库,而无需构建整个项目.我dependency:copy-dependencies在另一个案例中使用了目标,它有同样的问题.
我在其他场景中也遇到了类似的问题:"mvn clean generate-source"无法解决依赖关系.当我运行时mvn clean compile,一切正常,但是当我运行时mvn clean generate-source,它失败了,因为Maven无法解决模块间依赖性.在那种情况下,这是由@requiresDependencyResolutionantrun插件引起的.
由于antrun插件和依赖插件在Maven世界中非常流行,我相信我不是唯一遇到过这个问题的人.有人发现任何解决方案/解决方法吗
如何在JVM崩溃后重新启动Jobs?
当我的JVM崩溃或系统出现故障时,我运行了很多在Spring Batch框架中实现的Jobs.如何在失败后重新启动这些作业?
我有一个由.NET代码序列化的protobuf文件,我想将它用于Java.在.NET代码中,有Dictionary数据类型,proto架构看起来像
message Pair {
optional string key = 1;
optional string value = 2;
}
message Dictionary {
repeated Pair pairs = 1;
}
Run Code Online (Sandbox Code Playgroud)
正如协议缓冲区中的stackoverflow post Dictionary中所述 .
我可以使用protoc将proto文件编译成Java类.我可以成功地将protobuf文件反序列化为Java对象.唯一的问题是它转换为Java中的Pair对象列表而不是HashMap.当然,我仍然拥有所有数据,但我无法按照自己的喜好有效地访问数据.如果我有键的值,我必须遍历整个列表以获得其对应的值.这似乎不是最佳的.
我想知道是否有更好的方法来模拟protobuf中的字典/地图数据类型.
谢谢
更新:
我试过Jon Skeet的建议,在地址簿示例中添加地图类型字段,但仍然遇到问题.
message Person {
required string name = 1;
required int32 id = 2; // Unique ID number for this person.
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2; …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 protobuf 对象转换为 Avro。我在用
//myProto object is deserialized using google protobuf API
ProtobufDatumWriter<MyProto> pbWriter = new ProtobufDatumWriter<MyProto>(MyProto.class);
FileOutputStream fo = new FileOutputStream(args[0]);
Encoder e = EncoderFactory.get().binaryEncoder(fo, null);
pbWriter.write(myProto, e);
fo.flush();
Run Code Online (Sandbox Code Playgroud)
avro 文件已成功创建。如果我cat文件,我可以看到文件中的数据。但是,当我尝试使用 avro-tools 获取有关保存的 avro 文件的架构或元信息时,它说
Exception in thread "main" java.io.IOException: Not a data file.
at org.apache.avro.file.DataFileStream.initialize(DataFileStream.java:105)
at org.apache.avro.file.DataFileReader.<init>(DataFileReader.java:97)
at org.apache.avro.tool.DataFileGetSchemaTool.run(DataFileGetSchemaTool.java:47)
Run Code Online (Sandbox Code Playgroud)
查看 Avro 源代码,错误意味着它的前 4 个字节与MAGIC 的前 4 个字节不匹配。我想看看我是否做错了什么。
感谢您能给我的任何帮助。
那里
我有一个父pom.xml,它定义了maven-ear-plugin的默认配置
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.8</version>
<configuration>
<modules>
<jarModule>
<groupId>com.test</groupId>
<artifactId>artifact1</artifactId>
</jarModule>
<jarModule>
<groupId>com.test</groupId>
<artifactId>artifact2</artifactId>
</jarModule>
</modules>
</configuration>
</plugin>
</plugins>
</pluginManagement>
Run Code Online (Sandbox Code Playgroud)
在孩子pom中,我在该<plugins>部分中定义了maven-ear-plugin
<plugin>
<artifactId>maven-ear-plugin</artifactId>
<executions>
<execution>
<id>default-ear</id>
<phase>package</phase>
<goals>
<goal>ear</goal>
</goals>
<configuration>
<earSourceDirectory>EarContent</earSourceDirectory>
<defaultLibBundleDir>APP-INF/lib</defaultLibBundleDir>
<modules>
<jarModule>
<groupId>com.test</groupId>
<artifactId>artifact3</artifactId>
</jarModule>
</modules>
</configuration>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
我的目的是在耳中包含所有3个jar文件artifact1,artifact2和artifact3.但是,在构建之后,仅包含子pom.xml中定义的artifact3.所以看起来默认情况下,<modules>子pom.xml中的定义会覆盖父pom中定义的内容,而不是将它们合并在一起.实际上,如果我删除了<modules>子pom.xml 中的整个部分,那么在构建之后将包含artifact1和artifact2.
我的问题是,是否有一种方法可以包含父pom和child pom中定义的所有jar模块.我有几个耳朵项目,所有这些都需要包含相同的jar模块和一些自己的jar模块.我试图将常用的jar模块集移动到父模块,以便它们不会在每个子pom.xml中重复.
更新以澄清我的项目关系:
parent pom.xml (define maven-ear-plugin in the pluginManagement section)
-- project1 pom.xml (multi-module project)
-- myJar-proj1
-- myWeb-proj1
-- myEar-proj1 …Run Code Online (Sandbox Code Playgroud) java ×2
maven ×2
avro ×1
build ×1
maven-2 ×1
multi-module ×1
protobuf-net ×1
spring ×1
spring-batch ×1