小编Lan*_*Lan的帖子

如何解决多模块项目中模块之间的依赖关系?

在与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世界中非常流行,我相信我不是唯一遇到过这个问题的人.有人发现任何解决方案/解决方法吗

dependency-management maven multi-module

16
推荐指数
3
解决办法
1万
查看次数

JVM崩溃后的Spring Batch

如何在JVM崩溃后重新启动Jobs?

当我的JVM崩溃或系统出现故障时,我运行了很多在Spring Batch框架中实现的Jobs.如何在失败后重新启动这些作业?

spring spring-batch

7
推荐指数
2
解决办法
2155
查看次数

如何有效地在ProtoBuf中建模HashMap/Dictionary

我有一个由.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)

java serialization protocol-buffers protobuf-net

4
推荐指数
1
解决办法
2万
查看次数

将 protobuf 转换为 Avro

我正在尝试将 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 个字节不匹配。我想看看我是否做错了什么。

感谢您能给我的任何帮助。

java protocol-buffers avro

4
推荐指数
1
解决办法
6092
查看次数

来自pluginManagement的Maven插件继承

那里

我有一个父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)

maven-2 build maven

1
推荐指数
1
解决办法
4849
查看次数